Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

कॉलम के मान के आधार पर लगातार पंक्तियों को कैसे खोजें?

इसे आजमाएं

WITH cte
AS
(
    SELECT *,COUNT(1) OVER(PARTITION BY cnt) pt  FROM
    (
        SELECT tt.*
           ,(SELECT COUNT(id) FROM t WHERE data <= 10 AND ID < tt.ID) AS cnt
        FROM  t tt
        WHERE data > 10
    ) t1
)

SELECT id, [when], data FROM cte WHERE pt >= 3

एसक्यूएल फिडल डेमो

आउटपुट

id  when                    data
2   2013-08-02 00:00:00.000 121
3   2013-08-03 00:00:00.000 132
4   2013-08-04 00:00:00.000 15
6   2013-08-06 00:00:00.000 1435
7   2013-08-07 00:00:00.000 143
8   2013-08-08 00:00:00.000 18
9   2013-08-09 00:00:00.000 19

संपादित करें

सबसे पहले आंतरिक क्वेरी रिकॉर्ड की संख्या की गणना करती है जहां डेटा <=10

SELECT tt.*
     ,(SELECT COUNT(id) FROM t WHERE data <= 10 AND ID < tt.ID) AS cnt
FROM  t tt

आउटपुट

id  when                    data   cnt
1   2013-08-01 00:00:00.000 1       1
2   2013-08-02 00:00:00.000 121     1
3   2013-08-03 00:00:00.000 132     1
4   2013-08-04 00:00:00.000 15      1
5   2013-08-05 00:00:00.000 9       2
6   2013-08-06 00:00:00.000 1435    2
7   2013-08-07 00:00:00.000 143     2
8   2013-08-08 00:00:00.000 18      2
9   2013-08-09 00:00:00.000 19      2
10  2013-08-10 00:00:00.000 1       3
11  2013-08-11 00:00:00.000 1234    3
12  2013-08-12 00:00:00.000 124     3
13  2013-08-13 00:00:00.000 6       4

फिर हम डेटा> 10

. के साथ रिकॉर्ड्स को फ़िल्टर करते हैं
WHERE data > 10

अब हम cnt कॉलम को विभाजित करके रिकॉर्ड गिनते हैं

SELECT *,COUNT(1) OVER(PARTITION BY cnt) pt  FROM
(
    SELECT tt.*
        ,(SELECT COUNT(id) FROM t WHERE data <= 10 AND ID < tt.ID) AS cnt
    FROM  t tt
    WHERE data > 10
) t1

आउटपुट

id  when    data                   cnt  pt
2   2013-08-02 00:00:00.000 121     1   3
3   2013-08-03 00:00:00.000 132     1   3
4   2013-08-04 00:00:00.000 15      1   3
6   2013-08-06 00:00:00.000 1435    2   4
7   2013-08-07 00:00:00.000 143     2   4
8   2013-08-08 00:00:00.000 18      2   4
9   2013-08-09 00:00:00.000 19      2   4
11  2013-08-11 00:00:00.000 1234    3   2
12  2013-08-12 00:00:00.000 124     3   2

उपरोक्त क्वेरी को अस्थायी तालिका की तरह ही सीटीई में रखा गया है

अब उन रिकॉर्ड्स को चुनें जिनकी लगातार गिनती हो रही है>=3

SELECT id, [when], data FROM cte WHERE pt >= 3

एक अन्य समाधान

;WITH partitioned AS (
  SELECT *, id - ROW_NUMBER() OVER (ORDER BY id) AS grp
  FROM t
  WHERE data > 10
),
counted AS (
  SELECT *, COUNT(*) OVER (PARTITION BY grp) AS cnt
  FROM partitioned
)

SELECT id, [when], data
FROM counted
WHERE cnt >= 3

संदर्भ URL

एसक्यूएल फिडल डेमो



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर (T-SQL) में किसी विशिष्ट भाषा के लिए प्रयुक्त दिनांक स्वरूपों को कैसे खोजें

  2. SQL सर्वर डेटा की स्क्रिप्ट कैसे प्राप्त करें?

  3. SQL सर्वर और स्पेक्टर/मेल्टडाउन कमजोरियाँ

  4. एसक्यूएल में एक स्ट्रिंग में सबस्ट्रिंग की पहली घटना को बदलें

  5. एएसपीनेट में एक एसक्यूएल सर्वर डेटाबेस से एक छवि प्रदर्शित करने का सबसे अच्छा तरीका क्या है?