如何为不同的集合和子集提取最大时间戳

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 服务器,您可以按 LocationAisle 组分配 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