首页 > 解决方案 > 选择 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>活动。如果在一个组中没有跟随最后一个,按 排序,对应的可以安全地被认为是无效的。AEEATSSerial Number

我需要的

对于按升序Serial Number排序的每个 ,TS我需要Address最后一次出现的Activity = E,当且仅当最后一次E没有跟随另一个A,否则Address可能包含INVALID或者Serial Number可以从结果中省略相应的。

标签: sqlpostgresql

解决方案


您需要任何“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')
  );

推荐阅读