我的SQL语句有一个复杂的排序问题。我有一个包含以下列的表。
No Time Value
-- ---- -----
1 0900 ''
2 1030 ''
3 1020 ''
4 1010 ''
5 1100 ''
1 1015 'P'
2 1045 'P'
我想通过执行以下步骤对此表进行排序。
从表中选择值为''(空字符串)的行,并按否排序。
从同一个表中选择值为“P”的行,然后按时间对其进行排序。
从2中选择每一行并按时间插入1)。
结果应该是这样的。
No Time Value
-- ---- -----
1 0900 ''
1 1015 'P'
2 1030 ''
3 1020 ''
4 1010 ''
2 1045 'P'
5 1100 ''
如何在SQL中执行此操作?
答案 0 :(得分:2)
编辑:感谢您的评论。
重读时,我认为你的问题的第3部分没有意义。步骤1)的结果不按时间排序,您无法按时间插入。
例如,在您的示例结果中,第二行的时间为1015,即在0900和1030之间。但它也可能在1020和1010行之间进一步上升?
答案 1 :(得分:0)
您似乎可以在更简单的需求中表达您的需求 你总是按时间排序,也可能是按值,然后按否。
sort by time, value, no
这将按时间对所有内容进行排序。对于两个相同的时间,将应用值的排序等。
您可以对您构建的唯一数字进行排序,以合并您的条件。但那会更复杂。
答案 2 :(得分:0)
不幸的是,我不认为您可以使用标准SQL查询来执行此操作,原因是您的算法不是面向集合的。您的样本数据集说明了这一点 - 您在0900和1030记录之间显示了第一个“P”记录,但根据您的标准将其放在1010和1045记录之间是合适的。如果将它放在您显示的位置是正确的,您需要将条件修改为“将#2中的每一行放在#1中的前两行之间并将其及时括起来”,其中“first”定义按#1的分类标准。
结果是这种类型的设置可能会迫使您进入基于游标的解决方案。如果您可以识别要订购的复合值,您可以避免这种情况,但根据您的上述内容,我看不出它可能是什么。