如何为不同的集合和子集提取最大时间戳
How to pull max timestamp for distinct sets and subsets
编辑:DBMS = Haddoop,使用 Teradata SQL 助手
这是原文table。有 20 个位置值 (c1)。每个位置都有一组过道 (c2)。我想从此 table 获取所有记录集,以获取不同位置及其基于 max(tstamp) 的不同过道集。
Location
Aisle
Tstamp
qty
time
12
420
4/16/2021 12:22:01 PM
999
999
23
220
4/16/2021 11:22:01 PM
8888
222
31
310
4/16/2021 10:22:01 PM
666
333
12
420
4/16/2021 12:22:01 AM
666
444
31
120
4/16/2021 3:22:01 PM
666
555
22
210
4/16/2021 01:22:01 PM
666
666
我用过这个
SELECT*FROM store_control WHERE store_control.tstamp IN (SELECT MAX(tstamp) FROM store_control AS sql2)
结果:
Location
Aisle
Tstamp
qty
time
23
220
4/16/2021 11:22:01 PM
8888
222
我要的是这个:
Location
Aisle
Tstamp
qty
time
12
420
4/16/2021 12:22:01 PM
999
999
22
210
4/16/2021 01:22:01 PM
666
666
23
220
4/16/2021 11:22:01 PM
8888
222
31
310
4/16/2021 10:22:01 PM
666
333
31
120
4/16/2021 3:22:01 PM
666
555
您没有提到您使用的是哪个 DBMS,但大多数数据库都支持 Window Functions。
例如,使用 SQL 服务器,您可以按 Location
和 Aisle
组分配 ROW_NUMBER(),按最新的 TStamp
和 [= 排序14=] 首先。然后抓取行号 = 1 的记录:
注意:由于 Location = 12 的两条记录具有相同的 TStamp
,因此查询使用 Time
作为决胜条件
另见 db<>fiddle
;WITH cte AS
(
SELECT *
, ROW_NUMBER() OVER(PARTITION BY Location, Aisle ORDER BY Location, TStamp DESC, Time DESC) AS RowNum
FROM store_control
)
SELECT *
FROM cte
WHERE RowNum = 1
结果:
Location
Aisle
TStamp
Qty
Time
RowNum
12
420
2021-04-16 12:22:01.000
999
999
1
22
210
2021-04-16 13:22:01.000
666
666
1
23
220
2021-04-16 23:22:01.000
8888
222
1
31
120
2021-04-16 15:22:01.000
666
555
1
31
310
2021-04-16 22:22:01.000
666
333
1
@SOS 的答案可以在 Teradata 中使用 QUALIFY 来简化,以过滤窗口聚合的结果:
SELECT *
FROM store_control
QUALIFY
ROW_NUMBER()
OVER(PARTITION BY Location, Aisle
ORDER BY TStamp DESC, Time DESC) = 1
编辑:DBMS = Haddoop,使用 Teradata SQL 助手
这是原文table。有 20 个位置值 (c1)。每个位置都有一组过道 (c2)。我想从此 table 获取所有记录集,以获取不同位置及其基于 max(tstamp) 的不同过道集。
Location | Aisle | Tstamp | qty | time |
---|---|---|---|---|
12 | 420 | 4/16/2021 12:22:01 PM | 999 | 999 |
23 | 220 | 4/16/2021 11:22:01 PM | 8888 | 222 |
31 | 310 | 4/16/2021 10:22:01 PM | 666 | 333 |
12 | 420 | 4/16/2021 12:22:01 AM | 666 | 444 |
31 | 120 | 4/16/2021 3:22:01 PM | 666 | 555 |
22 | 210 | 4/16/2021 01:22:01 PM | 666 | 666 |
我用过这个
SELECT*FROM store_control WHERE store_control.tstamp IN (SELECT MAX(tstamp) FROM store_control AS sql2)
结果:
Location | Aisle | Tstamp | qty | time |
---|---|---|---|---|
23 | 220 | 4/16/2021 11:22:01 PM | 8888 | 222 |
我要的是这个:
Location | Aisle | Tstamp | qty | time |
---|---|---|---|---|
12 | 420 | 4/16/2021 12:22:01 PM | 999 | 999 |
22 | 210 | 4/16/2021 01:22:01 PM | 666 | 666 |
23 | 220 | 4/16/2021 11:22:01 PM | 8888 | 222 |
31 | 310 | 4/16/2021 10:22:01 PM | 666 | 333 |
31 | 120 | 4/16/2021 3:22:01 PM | 666 | 555 |
您没有提到您使用的是哪个 DBMS,但大多数数据库都支持 Window Functions。
例如,使用 SQL 服务器,您可以按 Location
和 Aisle
组分配 ROW_NUMBER(),按最新的 TStamp
和 [= 排序14=] 首先。然后抓取行号 = 1 的记录:
注意:由于 Location = 12 的两条记录具有相同的 TStamp
,因此查询使用 Time
作为决胜条件
另见 db<>fiddle
;WITH cte AS
(
SELECT *
, ROW_NUMBER() OVER(PARTITION BY Location, Aisle ORDER BY Location, TStamp DESC, Time DESC) AS RowNum
FROM store_control
)
SELECT *
FROM cte
WHERE RowNum = 1
结果:
Location | Aisle | TStamp | Qty | Time | RowNum |
---|---|---|---|---|---|
12 | 420 | 2021-04-16 12:22:01.000 | 999 | 999 | 1 |
22 | 210 | 2021-04-16 13:22:01.000 | 666 | 666 | 1 |
23 | 220 | 2021-04-16 23:22:01.000 | 8888 | 222 | 1 |
31 | 120 | 2021-04-16 15:22:01.000 | 666 | 555 | 1 |
31 | 310 | 2021-04-16 22:22:01.000 | 666 | 333 | 1 |
@SOS 的答案可以在 Teradata 中使用 QUALIFY 来简化,以过滤窗口聚合的结果:
SELECT *
FROM store_control
QUALIFY
ROW_NUMBER()
OVER(PARTITION BY Location, Aisle
ORDER BY TStamp DESC, Time DESC) = 1