DB2 SQL:选择值与前一个不同的行
DB2 SQL : selecting rows where value is different from previous one
假设我有这样一个 table (PERSON):
我只想 select 列“C”的值与上一行相比发生变化的行。
在这种情况下,我应该得到:第 1、4、5、7、8、9 和 15 行。
我不知道如何实现这一目标。
有人有想法吗?
谢谢
试试这个:
WITH PERSON (ROW_NUMBER, C) AS
(
VALUES
( 1, NULL::INT)
, ( 3, NULL::INT)
, ( 4, 189)
, ( 5, NULL::INT)
, ( 6, NULL::INT)
, ( 7, 212)
, ( 8, NULL::INT)
, ( 9, 235)
, (10, 235)
, (11, NULL::INT)
)
SELECT ROW_NUMBER, C
FROM
(
SELECT
P.*
, LAG (P.C) OVER (ORDER BY ROW_NUMBER) AS C_PREV
, LAG (P.ROW_NUMBER) OVER (ORDER BY ROW_NUMBER) AS ROW_NUMBER_PREV
FROM PERSON P
)
WHERE
ROW_NUMBER_PREV IS NULL
OR (C IS DISTINCT FROM C_PREV)
ROW_NUMBER
C
1
4
189
5
7
212
8
9
235
11
假设我有这样一个 table (PERSON):
我只想 select 列“C”的值与上一行相比发生变化的行。 在这种情况下,我应该得到:第 1、4、5、7、8、9 和 15 行。 我不知道如何实现这一目标。 有人有想法吗?
谢谢
试试这个:
WITH PERSON (ROW_NUMBER, C) AS
(
VALUES
( 1, NULL::INT)
, ( 3, NULL::INT)
, ( 4, 189)
, ( 5, NULL::INT)
, ( 6, NULL::INT)
, ( 7, 212)
, ( 8, NULL::INT)
, ( 9, 235)
, (10, 235)
, (11, NULL::INT)
)
SELECT ROW_NUMBER, C
FROM
(
SELECT
P.*
, LAG (P.C) OVER (ORDER BY ROW_NUMBER) AS C_PREV
, LAG (P.ROW_NUMBER) OVER (ORDER BY ROW_NUMBER) AS ROW_NUMBER_PREV
FROM PERSON P
)
WHERE
ROW_NUMBER_PREV IS NULL
OR (C IS DISTINCT FROM C_PREV)
ROW_NUMBER | C |
---|---|
1 | |
4 | 189 |
5 | |
7 | 212 |
8 | |
9 | 235 |
11 |