这可以很容易地在 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 子句中执行此操作)。瞧!