我有一个 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 语句中发挥创意,但我不知道具体该怎么做。
您可以使用 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 |