[英]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;
假設您需要每個id
的max(data_date)
個data
計數,則可以嘗試此操作。 它幾乎可以在所有RDBMS上運行。
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
來匹配id
和data
,然后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.