sql - 选择 PostgreSQL 表中每个组的最后一行
问题描述
我有一个如下所示的表:
TS | 序列号 | 活动 | 地址 |
---|---|---|---|
1 | 123456 | AAAABBBBCCCC | |
2 | 123456 | AAAABBBBCCCC | |
3 | 123456 | 一个 | AAAABBBBCCCC |
4 | 123456 | 乙 | AAAABBBBCCCC |
5 | 876543 | 一个 | UNIUNIUNIUNI |
6 | 123456 | 一个 | AAAABBBBCCCC |
7 | 123456 | 乙 | 哇哇哇哇 |
8 | 123456 | 哇哇哇哇 | |
9 | 876543 | 乙 | 紫花苜蓿 |
10 | 876543 | 紫花苜蓿 |
TS
是一个时间戳列,通常包含一个 ISO 日期字符串。为了简单起见,我将其缩短了。
如您所见,Address
只要有Activity = E
.
未分组的行可以按半任意顺序排列,尽管A
组中的每个 Activity 在按时间戳 ( TS
) 排序时,必须始终跟在 Activity 之后E
,但不一定立即。在和之间可以有<null>
活动。如果在一个组中没有跟随最后一个,按 排序,对应的可以安全地被认为是无效的。A
E
E
A
TS
Serial Number
对于按升序Serial Number
排序的每个 ,TS
我需要Address
最后一次出现的Activity = E
,当且仅当最后一次E
没有跟随另一个A
,否则Address
可能包含INVALID
或者Serial Number
可以从结果中省略相应的。
解决方案
您需要任何“E”行,后面不跟任何具有相同序列号的“A”或“E”。
这在 SQL 中翻译为:
SELECT Serial_Number, Address
FROM Tbl ret
WHERE Activity = 'E'
AND NOT EXISTS (
SELECT *
FROM Tbl witness
WHERE witness.Serial_Number = ret.Serial_Number
AND witness.TS > ret.TS
AND witness.Activity IN ('A', 'E')
);
推荐阅读
- c++ - 为什么 std::future 和 std::promise 不是最终的?
- javascript - 使用打字稿的摩卡测试失败
- junit - Junit:注入依赖项
- java - 使用 JPA 2.0 Criteria API 对 Long 值执行类似操作
- apostrophe-cms - ApostropheCMS 中的第三方地图
- android - 导入到 Samsung Health 的数据不会显示在应用程序中,但会导入到 HealthDataStorage
- html - 如何更改 HTML 标题元素的工具提示文本?
- reactjs - 有什么区别
和组件()? - azure-stream-analytics - 有没有办法确定作业运行的“起点”?
- javascript - 如何通过按 React-Native 中的一个抽屉项目从抽屉导航移到上一个屏幕?