簡體   English   中英

SQL查詢最后連續的相同數據

[英]SQL query for last consecutive same data

我在表格中有數據

+----+------------+------+
| Id | data_date  | data |
+----+------------+------+
|  1 | 01/01/2017 |    1 |
|  1 | 01/02/2017 |    0 |
|  1 | 01/03/2017 |    0 |
|  1 | 01/04/2017 |    0 |
|  2 | 01/02/2017 |    0 |
|  2 | 01/03/2017 |    0 |
|  2 | 01/04/2017 |    1 |
|  2 | 01/05/2017 |    1 |
+----+------------+------+

數據列只有值0和1

我如何才能獲得最近幾天連續相同的數據類型,即每個ID為“ 0”或“ 1”

+----+-----------+-----------------+
| Id | data_Type | Last_Data_Count |
+----+-----------+-----------------+
|  1 |         0 |               3 |
|  2 |         1 |               2 |
+----+-----------+-----------------+

Oracle查詢

SELECT id,
       MAX( last_data ) AS data_type, 
       COUNT(*) AS last_data_count
FROM   (
  SELECT d.*,
         MAX ( CASE WHEN data <> last_data THEN data_date END )
           OVER ( PARTITION BY id ) AS last_date
  FROM   (
    SELECT d.*,
           MAX( data ) KEEP ( DENSE_RANK LAST ORDER BY data_date )
             OVER ( PARTITION BY id ) AS last_data
    FROM   data d
  ) d
)
WHERE  data_date > last_date
GROUP BY id;

假設您需要每個idmax(data_date)data計數,則可以嘗試此操作。 它幾乎可以在所有RDBMS上運行。

Rexter Sample for MYSQL

select t3.id
    ,max(data) as data_type
    ,count(data) as last_data_count
    from table t3
    where exists
        (select 1 from Table t1
            where exists  
            (select 1 from table t2
             where t1.id=t2.id
             group by t2.id
             having t1.data_date=max(t2.data_date)
             ) 
     and t1.id=t3.id and t1.data=t3.data
)
group by t3.id
;

說明:內部exists用於獲取每個最后data_date id基礎上max(date) 現在要獲取計數,我使用外部exists來匹配iddata ,然后group by id group by以獲取計數。

Oracle中 ,可以使用Tabibitosan然后將結果分組,這樣就可以輕松獲得(注意:我假設您的意思是“連續的最后幾天”是指連續的行,而不是連續的日期):

WITH sample_data AS (SELECT 1 ID, to_date('01/01/2017', 'dd/mm/yyyy') data_date, 1 DATA FROM dual UNION ALL
                     SELECT 1 ID, to_date('01/02/2017', 'dd/mm/yyyy') data_date, 0 DATA FROM dual UNION ALL
                     SELECT 1 ID, to_date('01/03/2017', 'dd/mm/yyyy') data_date, 0 DATA FROM dual UNION ALL
                     SELECT 1 ID, to_date('01/04/2017', 'dd/mm/yyyy') data_date, 0 DATA FROM dual UNION ALL
                     SELECT 2 ID, to_date('01/01/2017', 'dd/mm/yyyy') data_date, 0 DATA FROM dual UNION ALL
                     SELECT 2 ID, to_date('01/02/2017', 'dd/mm/yyyy') data_date, 0 DATA FROM dual UNION ALL
                     SELECT 2 ID, to_date('01/03/2017', 'dd/mm/yyyy') data_date, 1 DATA FROM dual UNION ALL
                     SELECT 2 ID, to_date('01/04/2017', 'dd/mm/yyyy') data_date, 1 DATA FROM dual UNION ALL
                     SELECT 3 ID, to_date('01/01/2017', 'dd/mm/yyyy') data_date, 0 DATA FROM dual UNION ALL
                     SELECT 3 ID, to_date('01/02/2017', 'dd/mm/yyyy') data_date, 1 DATA FROM dual UNION ALL
                     SELECT 3 ID, to_date('01/03/2017', 'dd/mm/yyyy') data_date, 0 DATA FROM dual UNION ALL
                     SELECT 3 ID, to_date('01/05/2017', 'dd/mm/yyyy') data_date, 0 DATA FROM dual)
-- end of mimicking data in a table called "sample_data"
-- see below for the main SQL query:
SELECT ID,
       DATA,
       COUNT(*) last_data_count
FROM   (SELECT ID,
               data_date,
               DATA,
               MAX(data_date) OVER (PARTITION BY ID) max_data_date,
               row_number() OVER (PARTITION BY ID ORDER BY data_date)
                 - row_number() OVER (PARTITION BY ID, DATA ORDER BY data_date) grp
        FROM   sample_data)
GROUP BY ID,
         DATA,
         grp,
         max_data_date
HAVING   max_data_date = MAX(data_date);

        ID       DATA LAST_DATA_COUNT
---------- ---------- ---------------
         1          0               3
         2          1               2
         3          0               2

tabibitosan部分(即, row_number() over (<overall set of data>) - row_number() over (<subset of data>) )為每組連續的行創建一個組號(我的意思是緊挨着的行彼此以指定的順序-在數據列中具有相同值的*非*連續日期的行)。

一旦獲得此值,就可以輕松找到每組連續行的計數。 但是,由於您追求的是最新計數,因此我使用MAX()分析函數為每個ID查找最新的data_date。

然后,我們可以比較每一組連續的行的最大data_date,並用它來查找此ID的最大data_date(我們的在做匹配的組連續的行having條款)。 瞧!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM