【发布时间】:2013-02-01 01:14:53
【问题描述】:
如何编写查询以查找以下数据空白。
--场景1 -- 查询1 --在同一个表中查找间隙(例如 tableb )
ID EFF_DT TERM_DT
800 6/15/2012 12:00:00.000 AM 10/14/2012 12:00:00.000 AM -- GAP
800 10/16/2012 12:00:00.000 AM 11/14/2012 12:00:00.000 AM
800 11/15/2012 12:00:00.000 AM 12/31/9999 12:00:00.000 AM
--场景2 -- 查询2 --查找2个表(tablea,tableb)之间的不匹配
-- tablea , sample data below
ID EFF_DT TERM_DT
400 6/15/2012 12:00:00.000 AM 10/14/2012 12:00:00.000 AM
400 11/15/2012 12:00:00.000 AM 12/31/9999 12:00:00.000 AM
500 6/15/2012 12:00:00.000 AM 10/14/2012 12:00:00.000 AM
500 10/15/2012 12:00:00.000 AM 11/14/2012 12:00:00.000 AM
500 11/15/2012 12:00:00.000 AM 12/31/9999 12:00:00.000 AM
-- tableb, sample data below
ID EFF_DT TERM_DT
400 6/15/2012 12:00:00.000 AM 10/13/2012 12:00:00.000 AM -- mismatch
400 11/15/2012 12:00:00.000 AM 12/31/9999 12:00:00.000 AM
500 6/15/2012 12:00:00.000 AM 11/14/2012 12:00:00.000 AM
500 11/15/2012 12:00:00.000 AM 12/31/9999 12:00:00.000 AM
-- Note 400 is a mismatch since ranges are different in both tables, 500 is okay (even though rows are split they still match )
-- Need to identify ID 400
表格有时有 1/1/1753 表示低日期,12/31/9999 表示高日期。
尝试了以下查询,但在第一种情况下会引发 oracle 错误。 [ ORA-01841:(完整)年份必须介于 -4713 和 +9999 之间,并且不能为 0 ]
SELECT ID, TERM_DT AS gap_lower_bound, next_date AS gap_upper_bound
FROM (SELECT t.*,
LEAD (EFF_DT)
OVER (PARTITION BY ID ORDER BY EFF_DT)
next_date
FROM TABLEB t)
WHERE -- trim(next_date) is not null and
next_date > TERM_DT + 1
谢谢。
【问题讨论】:
-
首先,这似乎是两个独立的问题——您应该创建第二个问题并从此处删除第二个问题。
EFF_DT和TERM_DT的数据类型是什么?这些名称暗示它们是DATE列。但数据与DATE不一致——DATE没有小数秒。是TIMESTAMP吗?VARCHAR2?还有什么? -
它的时间戳字段,用作日期。谢谢