同时按时间戳和另一个字段对 SQL 结果进行排序

问题描述 投票:0回答:1

我有一个 SQL 表(在 Microsoft SQL Server 2019 中)用于跟踪库存订单。我们称之为订单。看起来像这样:

身份证 工作单元 已进入
1 T1A 2024-04-25 13:50:01.990
2 T1B 2024-04-25 14:22:18.727
3 DTA 2024-04-25 14:22:55.237
4 552-8A 2024-04-25 14:34:56.890
5 T1A 2024-04-25 14:51:01.173
6 DTA 2024-04-25 15:22:08.527

我需要像下面这样排序。换句话说,我需要将类似的工作单元聚集在一起,并按每个唯一集群中最旧的时间戳对这些集群进行排序。

由于 T1A (ID 1) 是样本数据中最旧的时间戳,因此每隔一个 T1A 条目(在本例中仅为 ID 5)应按时间戳升序紧随其后,然后是 T1B,因为该工作单元具有下一个最旧的时间戳过滤掉所有T1A条目后的时间戳,依此类推。

身份证 工作单元 已进入
1 T1A 2024-04-25 13:50:01.990
5 T1A 2024-04-25 14:51:01.173
2 T1B 2024-04-25 14:22:18.727
3 DTA 2024-04-25 14:22:55.237
6 DTA 2024-04-25 15:22:08.527
4 552-8A 2024-04-25 14:34:56.890

如果我按时间戳订购,则无法按工作单元订购。如果我按工作单元排序,然后按时间戳排序,它会将工作单元按字母顺序排列,这当然不是我想要的。我认为我需要在 ORDER BY 语句中发挥创意,但我不知道具体该怎么做。

sql sql-server
1个回答
0
投票

您可以使用 MIN 窗口函数来计算每个分组的最小日期(在本例中您希望它是每个工作单元)并将其用于排序:

SELECT  *
FROM    (
    VALUES  (1, N'T1A', N'2024-04-25 13:50:01.990')
    ,   (2, N'T1B', N'2024-04-25 14:22:18.727')
    ,   (3, N'DTA', N'2024-04-25 14:22:55.237')
    ,   (4, N'552-8A', N'2024-04-25 14:34:56.890')
    ,   (5, N'T1A', N'2024-04-25 14:51:01.173')
    ,   (6, N'DTA', N'2024-04-25 15:22:08.527')
) t (ID,Workcell,EnteredOn)
ORDER BY MIN(EnteredOn) OVER(PARTITION BY Workcell), Workcell, EnteredOn

我将 Workcell 添加为第二顺序,以打破平局,以防多个组具有相同的最小值。

输出:

身份证 工作单元 已进入
1 T1A 2024-04-25 13:50:01.990
5 T1A 2024-04-25 14:51:01.173
2 T1B 2024-04-25 14:22:18.727
3 DTA 2024-04-25 14:22:55.237
6 DTA 2024-04-25 15:22:08.527
4 552-8A 2024-04-25 14:34:56.890
© www.soinside.com 2019 - 2024. All rights reserved.