मैं LeetCode पर इस समस्या को आज़मा रही हूं। इंटरफ़ेस एक सिंटैक्स त्रुटि फेंक रहा है, लेकिन मेरे जीवन के लिए मैं इसका पता नहीं लगा सकता। यहाँ प्रश्न है:

टेबल: स्टेडियम

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| visit_date    | date    |
| people        | int     |
+---------------+---------+

विज़िट_डेट इस तालिका की प्राथमिक कुंजी है। इस तालिका की प्रत्येक पंक्ति में विज़िट की तारीख और विज़िट के दौरान लोगों की संख्या के साथ स्टेडियम की विज़िट आईडी होती है। किसी भी दो पंक्तियों में समान विज़िट_डेट नहीं होगी, और जैसे-जैसे आईडी बढ़ती है, तिथियां भी बढ़ती जाती हैं।

लगातार आईडी के साथ तीन या अधिक पंक्तियों के साथ रिकॉर्ड प्रदर्शित करने के लिए एक SQL क्वेरी लिखें, और लोगों की संख्या प्रत्येक के लिए 100 से अधिक या उसके बराबर है।

विज़िट_डेट द्वारा क्रमित परिणाम तालिका को आरोही क्रम में लौटाएं।

क्वेरी परिणाम स्वरूप निम्न उदाहरण में है।

Stadium table:
+------+------------+-----------+
| id   | visit_date | people    |
+------+------------+-----------+
| 1    | 2017-01-01 | 10        |
| 2    | 2017-01-02 | 109       |
| 3    | 2017-01-03 | 150       |
| 4    | 2017-01-04 | 99        |
| 5    | 2017-01-05 | 145       |
| 6    | 2017-01-06 | 1455      |
| 7    | 2017-01-07 | 199       |
| 8    | 2017-01-09 | 188       |
+------+------------+-----------+

Result table:
+------+------------+-----------+
| id   | visit_date | people    |
+------+------------+-----------+
| 5    | 2017-01-05 | 145       |
| 6    | 2017-01-06 | 1455      |
| 7    | 2017-01-07 | 199       |
| 8    | 2017-01-09 | 188       |
+------+------------+-----------+

आईडी ५, ६, ७, और ८ वाली चार पंक्तियों में लगातार आईडी हैं और उनमें से प्रत्येक में >= १०० लोगों ने भाग लिया है। ध्यान दें कि पंक्ति 8 को शामिल किया गया था, भले ही विज़िट_डेट पंक्ति 7 के बाद अगले दिन नहीं थी। आईडी 2 और 3 वाली पंक्तियों को शामिल नहीं किया गया है क्योंकि हमें कम से कम लगातार तीन आईडी की आवश्यकता है।

यहां डेटा के साथ एक पहेली है (नोट: मैं अभी भी यह पता लगाने की कोशिश कर रहा हूं तारीखें कैसे डालें, इसलिए मैंने तारीखों को इसके बजाय तार के रूप में सहेजा)।

क्या कोई नीचे दी गई क्वेरी में सिंटैक्स त्रुटि खोज सकता है?

# Write your MySQL query statement below
SET @rowIndex := 0;

WITH s1 as (
    SELECT @rowIndex := @rowIndex + 1 as rowIndex, s.*
    FROM Stadium as s
    WHERE s.people >= 100
    GROUP BY s.id
)

SELECT s2.id, s2.visit_date, s2.people
FROM s1 as s2
GROUP BY s2.rowIndex - s2.id, s2.id, s2.visit_date, s2.people
ORDER BY s2.visit_date

त्रुटि संदेश:

आपको अपने SQL सिंटैक्स में कोई त्रुटि है; सही सिंटैक्स के लिए अपने MySQL सर्वर संस्करण से मेल खाने वाले मैनुअल की जाँच करें, जिसका उपयोग 'विथ s1 (rowIndex, id, visit_date, people) के रूप में किया जा सकता है ( SELECT @rowIndex := @rowInde' लाइन 4 पर

साथ ही, LeetCode इंटरफ़ेस MySQL v8.0 का उपयोग करता है, इसलिए मुझे नहीं लगता कि यह समस्या है।

मैं संदर्भ के रूप में नीचे दी गई क्वेरी का उपयोग कर रहा था। (मूल। )

SET @rowIndex := -1;
SELECT ROUND(AVG(t.LAT_N), 4) FROM
(
SELECT @rowIndex := @rowIndex+1 AS rowIndex, s.LAT_N FROM STATION AS s ORDER BY s.LAT_N
) AS t
WHERE t.rowIndex IN (FLOOR(@rowIndex / 2), CEIL(@rowIndex / 2));

धन्यवाद।

संपादित करें:

भविष्य के संदर्भ के लिए, यहां अंतिम प्रश्न है जिसके साथ मैं आया था:

# Write your MySQL query statement below
WITH s1 as (
    SELECT ROW_NUMBER() OVER (ORDER BY s.id) as rowIndex, s.*
    FROM Stadium as s
    WHERE s.people >= 100
    GROUP BY s.id, s.visit_date, s.people
), s2 as (
    SELECT COUNT(s.id) OVER (PARTITION BY s.id-s.rowIndex) as groupSize, s.*
    FROM s1 as s
)

SELECT s3.id, s3.visit_date, s3.people
FROM s2 as s3
GROUP BY s3.groupSize, s3.id, s3.visit_date, s3.people
HAVING s3.groupSize >= 3
ORDER BY s3.visit_date
2
spheroidic 29 अक्टूबर 2020, 22:26

2 जवाब

सबसे बढ़िया उत्तर

आपने पुष्टि की है कि आप MySQL 8.0.21 सर्वर का उपयोग कर रहे हैं, इसलिए मेरे पास एकमात्र अन्य सुझाव यह है कि आप एक कॉल में दो SQL कथन चलाने का प्रयास कर रहे हैं:

SET @rowIndex := 0;

WITH s1 as (
  SELECT...

अधिकांश MySQL कनेक्टर डिफ़ॉल्ट रूप से बहु-क्वेरी का समर्थन नहीं करते हैं। दूसरे शब्दों में, आप प्रति कॉल केवल एक स्टेटमेंट कर सकते हैं। जैसे ही MySQL आपके पहले ; के बाद कोई भी सिंटैक्स देखता है, यह इसे सिंटैक्स त्रुटि के रूप में मानता है।

कोई कारण नहीं है कि आपको बहु-क्वेरी का उपयोग करने की आवश्यकता है। बस दो कथनों को अलग-अलग चलाएँ। जब तक आप उसी सत्र का उपयोग करते हैं, तब तक आपका @rowIndex का मान बाद के कथनों के लिए उपलब्ध रहेगा।

MySQL के इंजीनियरिंग के पूर्व निदेशक ने एक बार मुझसे कहा था, "कोई कारण नहीं है कि बहु-क्वेरी मौजूद होनी चाहिए।"

1
Bill Karwin 30 अक्टूबर 2020, 00:52
  • सुनिश्चित नहीं है कि आप किस समस्या का सामना कर रहे हैं, फिर भी यह LeetCode पर पारित होगा:

  • सुनिश्चित नहीं है कि यह करने का यह सही तरीका है:

SELECT DISTINCT S1.id,
                S1.visit_date,
                S1.people
FROM stadium AS S1,
     stadium AS S2,
     stadium AS S3
WHERE S1.people > 99
  AND S2.people > 99
  AND S3.people > 99
  AND ( (S2.id = S1.id + 1
         AND S3.id = S1.id + 2)
       OR (S2.id = S1.id - 1
           AND S3.id = S1.id + 1)
       OR (S2.id = S1.id - 1
           AND S3.id = S1.id - 2) )
ORDER BY id ASC;
0
Emma 29 अक्टूबर 2020, 22:34