1

编辑:DBMS = Hadoop,使用 Teradata SQL 助手

这是原始表。有 20 个位置值 (c1)。每个位置都有一组过道 (c2)。我想从此表中获取所有记录集,以获取不同位置及其基于 max(tstamp) 的不同过道集。

地点 走道 邮票 数量 时间
12 420 2021 年 4 月 16 日下午 12:22:01 999 999
23 220 2021 年 4 月 16 日晚上 11:22:01 8888 222
31 310 2021 年 4 月 16 日晚上 10:22:01 666 333
12 420 2021 年 4 月 16 日上午 12:22:01 666 444
31 120 2021 年 4 月 16 日下午 3:22:01 666 555
22 210 2021 年 4 月 16 日下午 1:22:01 666 666

我用这个 SELECT*FROM store_control WHERE store_control.tstamp IN (SELECT MAX(tstamp) FROM store_control AS sql2)

结果:

地点 走道 邮票 数量 时间
23 220 2021 年 4 月 16 日晚上 11:22:01 8888 222

我想要的是这样的:

地点 走道 邮票 数量 时间
12 420 2021 年 4 月 16 日下午 12:22:01 999 999
22 210 2021 年 4 月 16 日下午 1:22:01 666 666
23 220 2021 年 4 月 16 日晚上 11:22:01 8888 222
31 310 2021 年 4 月 16 日晚上 10:22:01 666 333
31 120 2021 年 4 月 16 日下午 3:22:01 666 555
4

2 回答 2

1

您没有提到您正在使用哪个 DBMS,但大多数数据库都支持Window Functions

例如,使用 SQL Server,您可以按组分配ROW_NUMBER (),按最新Location和最先排序。然后抓取行号 = 1 的记录:AisleTStampTime

注意:由于 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

结果:

地点 走道 邮票 数量 时间 行号
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
于 2022-02-26T03:12:57.827 回答
1

@SOS 的答案可以在 Teradata 中简化,使用 QUALIFY 过滤窗口聚合的结果:

SELECT *
FROM store_control
QUALIFY 
   ROW_NUMBER()
   OVER(PARTITION BY Location, Aisle 
        ORDER BY TStamp DESC, Time DESC) = 1
于 2022-02-27T22:34:42.070 回答