我之前问了一个问题..
Finding missing dates in a sequence
我想知道每个ID的第一个缺失日期。
"unicodeKeyboard": True
"resetKeyboard": True
预期结果:
ID DATE
123 7/1/2015
123 6/1/2015
123 5/1/2015
123 4/1/2015
123 9/1/2014
123 8/1/2014
123 7/1/2014
123 6/1/2014
456 11/1/2014
456 10/1/2014
456 9/1/2014
456 8/1/2014
456 5/1/2014
456 4/1/2014
456 3/1/2014
789 9/1/2014
789 8/1/2014
789 7/1/2014
789 6/1/2014
789 5/1/2014
789 4/1/2014
789 3/1/2014
答案 0 :(得分:0)
尝试这样的事情:
<强> EDITED 强>
SELECT ID, ADD_MONTHS(MIN(DATE),1)
FROM (seelct ID, DATE from yourTable a where
not exists (select ID from yourTable b
where a.ID = b.ID and ADD_MONTHS(a.DATE,1) = b.DATE) )
GROUP BY ID
HAVING COUNT(*) > 1 -- every ID has one last month
答案 1 :(得分:0)
select cust_id, min(l_dt) as first_missing_date from
(select cust_id,
add_months(lag(dt) over (partition by cust_id order by dt), 1) l_dt,
dt
from test_data)
where l_dt != dt
group by cust_id;
test_data是表的名称,列是cust_id和dt。 (DATE是Oracle中的保留字,它不应该用于列名。)
此解决方案使用分析函数滞后(...) - 这使得解决方案更先进(更难以遵循),但比使用相关子查询更有效。
已添加以演示查询在我的计算机上的工作方式(因为下面的注释说明查询会出错)。它在我的机器上完美运行。我通过SQL * Plus,标准的Oracle&#34; DOS-like&#34; DB的接口。我的Oracle版本是11.2.0.2.0 XE(免费版)。
SQL> select cust_id, min(l_dt) as first_missing_date from
2 (select cust_id,
3 add_months(lag(dt) over (partition by cust_id order by dt), 1) l_dt,
4 dt
5 from test_data)
6 where l_dt != dt
7 group by cust_id;
CUST_ID FIRST_MIS
-------------------- ---------
123 01-OCT-14
456 01-JUN-14
2 rows selected.
Elapsed: 00:00:00.18