选择最后一组连续行中的第一行



如何选择连续行的最后一个"分组"中第一个出现的行,其中分组是由特定列值的连续出现定义的(在下面的state示例中(。

例如,给定下表:

所需值不完整BCC完成E
id 日期时间 状态
1 2021-04-01 09:42:41.319000A
2 2021-04-04 09:42:41.319000 完成
3 2021-04-05 09:42:41.319000 不完整
4 2021-04-05 10:42:41.319000 不完整
5 2021-04-07 09:42:41.319000D
6 2021-04-012 09:42:41.319000 完成

假设所有列为NOT NULL

SELECT *
FROM   tbl t1
WHERE  NOT EXISTS (
SELECT FROM tbl t2
WHERE  t2.state <> t1.state
AND    t2.datetime > t1.datetime
)
ORDER  BY datetime
LIMIT  1;

db<gt;小提琴这里

CCD_ 3仅对于最后一组对等体为真。(后面没有其他状态的行。(CCD_ 4并取第一个。Voilá。

这里有一个窗口函数解决方案,它只访问您的表一次(对于大型数据集,它可能会更好,也可能不会更好(:

SELECT *
FROM (
SELECT *, 
LEAD (state) OVER (ORDER BY datetime DESC) 
IS DISTINCT FROM state AS first_in_group
FROM tbl
) t
WHERE first_in_group
ORDER BY datetime DESC
LIMIT 1

一把以埃尔温·布兰斯特的为蓝本的小提琴。为了说明,这里是每行的first_in_group的值:

id  datetime                 state       value_needed  first_in_group
---------------------------------------------------------------------
6   2021-04-12 09:42:41.319  done        E             f
5   2021-04-07 09:42:41.319  done        D             t
4   2021-04-05 10:42:41.319  incomplete  C             f
3   2021-04-05 09:42:41.319  incomplete  C             t
2   2021-04-04 09:42:41.319  done        B             t
1   2021-04-01 09:42:41.319  incomplete  A             t

最新更新