【发布时间】:2023-04-08 13:33:01
【问题描述】:
我有一个视图,它显示某个物品到达多个位置的时间。我想根据到达时间订购这个视图:
ITEM | At Loc1 | At Loc2 | At Loc3 | At Loc4 | Desired Order
--------------------------------------------------------
aaa | 00:00 | 02:01 | NULL | 05:30 | 0
bbb | NULL | 02:30 | 06:21 | NULL | 1
ccc | 00:05 | 02:33 | NULL | 07:10 | 2
ddd | 00:07 | NULL | 06:25 | 09:00 | 3
eee | NULL | NULL | 06:30 | 09:10 | 4
fff | 00:30 | 02:55 | 06:32 | NULL | 5
有时,由于测量错误或不规则,无法记录到达时间。在那种情况下,时间是NULL
现在我想Select * from View ORDER BY AtLoc1 ASC, AtLoc2 ASC, AtLoc3 ASC, AtLoc4 ASC
但列中的 Null 值不应导致项目移到前面或后面。它应该根据下一列保持在正确的相对位置。
比如item bbb在位置1没有记录,但是在aaa之后ccc之前到达了位置2,所以应该在aaa和ccc之间排序,而不是在列表的开头或结尾
在大多数情况下,项目不会在位置之间更改它们的顺序,但这并非不可能。
我不认为我可以为所有特殊情况定义唯一且明确定义的排序顺序,当有太多 NULL 聚集在一起时,顺序可能未定义。但我只想介绍空值相对稀疏的最常见情况。
如何以这种方式在 SQL 中对视图进行排序?
【问题讨论】:
-
嗯,PIVOT 然后 ORDER BY 然后 UNPIVOT?这是一个棘手的问题。
标签: sql sql-server null sql-order-by sql-server-2016