return 乱序行
return out of order rows
这是 Postgres 中的关系 table。
我有一个 table 不断接收记录。结构是这样的:
组| object_date |钥匙 | event_tmstmp
- 其中组是一组记录的唯一标识符
- key 是包含日期时间的字符串(即:'sometext/some/more/20190324121233.csv)
- where object date an int of the substring of key (the value above, so 20190324121233)
- 其中 event_tmstp 是插入行时默认为 now() 的日期时间
我想做的事情:
- 按 event_tmstmp
对行进行排序
- 对于每组行,return 根据 object_date
"out of order" 的任何行
例如:
'group1' | 20190324121233 | 'sometext/some/more/20190324121233.csv' | 2019-09-26 14:57:12.747638
'group1' | 20190324121234 | 'sometext/some/more/20190324121234.csv' | 2019-09-26 14:58:12.747638
'group1' | 20190324121236 | 'sometext/some/more/20190324121236.csv' | 2019-09-26 15:00:12.747638
'group1' | 20190324121235 | 'sometext/some/more/20190324121235.csv' | 2019-09-26 15:01:12.747638
'group1' | 20190324121237 | 'sometext/some/more/20190324121237.csv' | 2019-09-26 15:02:12.747638
'group1' | 20190324121238 | 'sometext/some/more/20190324121238.csv' | 2019-09-26 15:05:12.747638
'group1' | 20190324121241 | 'sometext/some/more/20190324121241.csv' | 2019-09-26 15:06:12.747638
'group1' | 20190324121240 | 'sometext/some/more/20190324121240.csv' | 2019-09-26 15:08:12.747638
所以我想要的是 return 行:
'group1' | 20190324121235 | 'sometext/some/more/20190324121235.csv' | 2019-09-26 15:01:12.747638
'group1' | 20190324121240 | 'sometext/some/more/20190324121240.csv' | 2019-09-26 15:08:12.747638
这是我目前的情况:
SELECT a.*
FROM table_1 AS a
WHERE a.object_date >
( SELECT b.object_date
FROM table_1 AS b
ORDER BY b.event_tmstmp DESC
LIMIT 1
);
但这只是 return 一行,而不是每个 group
。
我想我需要一个 partition by 子句来完成这个。我说得对吗?
您可以使用 lag()
:
select t.*
from (select t.*,
lag(object_date) over (order by event_tmstmp) as prev_object_date
from t
) t
where prev_object_date > object_date;
这是 Postgres 中的关系 table。
我有一个 table 不断接收记录。结构是这样的:
组| object_date |钥匙 | event_tmstmp
- 其中组是一组记录的唯一标识符
- key 是包含日期时间的字符串(即:'sometext/some/more/20190324121233.csv)
- where object date an int of the substring of key (the value above, so 20190324121233)
- 其中 event_tmstp 是插入行时默认为 now() 的日期时间
我想做的事情:
- 按 event_tmstmp 对行进行排序
- 对于每组行,return 根据 object_date "out of order" 的任何行
例如:
'group1' | 20190324121233 | 'sometext/some/more/20190324121233.csv' | 2019-09-26 14:57:12.747638
'group1' | 20190324121234 | 'sometext/some/more/20190324121234.csv' | 2019-09-26 14:58:12.747638
'group1' | 20190324121236 | 'sometext/some/more/20190324121236.csv' | 2019-09-26 15:00:12.747638
'group1' | 20190324121235 | 'sometext/some/more/20190324121235.csv' | 2019-09-26 15:01:12.747638
'group1' | 20190324121237 | 'sometext/some/more/20190324121237.csv' | 2019-09-26 15:02:12.747638
'group1' | 20190324121238 | 'sometext/some/more/20190324121238.csv' | 2019-09-26 15:05:12.747638
'group1' | 20190324121241 | 'sometext/some/more/20190324121241.csv' | 2019-09-26 15:06:12.747638
'group1' | 20190324121240 | 'sometext/some/more/20190324121240.csv' | 2019-09-26 15:08:12.747638
所以我想要的是 return 行:
'group1' | 20190324121235 | 'sometext/some/more/20190324121235.csv' | 2019-09-26 15:01:12.747638
'group1' | 20190324121240 | 'sometext/some/more/20190324121240.csv' | 2019-09-26 15:08:12.747638
这是我目前的情况:
SELECT a.*
FROM table_1 AS a
WHERE a.object_date >
( SELECT b.object_date
FROM table_1 AS b
ORDER BY b.event_tmstmp DESC
LIMIT 1
);
但这只是 return 一行,而不是每个 group
。
我想我需要一个 partition by 子句来完成这个。我说得对吗?
您可以使用 lag()
:
select t.*
from (select t.*,
lag(object_date) over (order by event_tmstmp) as prev_object_date
from t
) t
where prev_object_date > object_date;