我需要运行一个Select语句(DB2 SQL),该语句不会基于某个字段提取相邻的行重复项。具体来说,我正在尝试找出数据何时 更改 ,这很困难,因为它可能会更改回其原始值。
也就是说,我有一个表格,其表述大致类似于以下内容,按字母排序,然后按日期排序:
A, 5, 2009-01-01 A, 12, 2009-02-01 A, 12, 2009-03-01 A, 12, 2009-04-01 A, 9, 2009-05-01 A, 9, 2009-06-01 A, 5, 2009-07-01
我想得到结果:
A, 5, 2009-01-01 A, 12, 2009-02-01 A, 9, 2009-05-01 A, 5, 2009-07-01
丢弃 相邻的 重复项,但保留最后一行(尽管它的编号与第一行相同)。显而易见的是:
Select Letter, Number, Min(Update_Date) from Table group by Letter, Number
不起作用-不包括最后一行。
编辑:由于似乎有些混乱,我已将月份列澄清为日期列。它的意思是人类可解析的简短形式,而不是实际的有效数据。
编辑:最后一行并不重要,因为它是最后一行,但是因为它有一个“新值”,它也是一个“旧值”。按NUMBER分组将其与第一行合并;它需要保持独立的实体。
根据您所使用的DB2,有一些分析函数可以使此问题易于解决。下面是Oracle中的一个示例,但是select语法似乎非常相似。
create table t1 (c1 char, c2 number, c3 date); insert into t1 VALUES ('A', 5, DATE '2009-01-01'); insert into t1 VALUES ('A', 12, DATE '2009-02-01'); insert into t1 VALUES ('A', 12, DATE '2009-03-01'); insert into t1 VALUES ('A', 12, DATE '2009-04-01'); insert into t1 VALUES ('A', 9, DATE '2009-05-01'); insert into t1 VALUES ('A', 9, DATE '2009-06-01'); insert into t1 VALUES ('A', 5, DATE '2009-07-01'); SQL> l 1 SELECT C1, C2, C3 2 FROM (SELECT C1, C2, C3, 3 LAG(C2) OVER (PARTITION BY C1 ORDER BY C3) AS PRIOR_C2, 4 LEAD(C2) OVER (PARTITION BY C1 ORDER BY C3) AS NEXT_C2 5 FROM T1 6 ) 7 WHERE C2 <> PRIOR_C2 8 OR PRIOR_C2 IS NULL -- to pick up the first value 9 ORDER BY C1, C3 SQL> / C C2 C3 - ---------- ------------------- A 5 2009-01-01 00:00:00 A 12 2009-02-01 00:00:00 A 9 2009-05-01 00:00:00 A 5 2009-07-01 00:00:00