如何从序列中获取缺少的日期

时间:2016-04-25 19:58:34

标签: sql oracle oracle11g

我之前问了一个问题..

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

2 个答案:

答案 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