如何选择连续行的最后一个"分组"中第一个出现的行,其中分组是由特定列值的连续出现定义的(在下面的state
示例中(。
例如,给定下表:
id | 日期时间 | 状态 | 所需值
---|---|---|
1 | 2021-04-01 09:42:41.319000 | 不完整A |
2 | 2021-04-04 09:42:41.319000 | 完成 | B
3 | 2021-04-05 09:42:41.319000 | 不完整 | C
4 | 2021-04-05 10:42:41.319000 | 不完整 | C
5 | 2021-04-07 09:42:41.319000 | 完成D |
6 | 2021-04-012 09:42:41.319000 | 完成 | E
假设所有列为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