小编典典

SQL-禁止重复的“ *”记录

sql

我需要运行一个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分组将其与第一行合并;它需要保持独立的实体。


阅读 219

收藏
2021-04-22

共1个答案

小编典典

根据您所使用的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
2021-04-22