在SQL中需要有关复杂排序的帮助

时间:2009-10-26 08:51:19

标签: sql sql-server tsql sorting

我的SQL语句有一个复杂的排序问题。我有一个包含以下列的表。

No   Time    Value  
--   ----    -----
 1   0900    ''
 2   1030    ''
 3   1020    ''
 4   1010    ''
 5   1100    ''
 1   1015    'P'
 2   1045    'P'

我想通过执行以下步骤对此表进行排序。

  1. 从表中选择值为''(空字符串)的行,并按否排序。

  2. 从同一个表中选择值为“P”的行,然后按时间对其进行排序。

  3. 从2中选择每一行并按时间插入1)。

  4. 结果应该是这样的。

    No   Time    Value  
    --   ----    -----
     1   0900    ''
     1   1015    'P'
     2   1030    ''
     3   1020    ''
     4   1010    ''
     2   1045    'P'
     5   1100    ''
    

    如何在SQL中执行此操作?

3 个答案:

答案 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的分类标准。

结果是这种类型的设置可能会迫使您进入基于游标的解决方案。如果您可以识别要订购的复合值,您可以避免这种情况,但根据您的上述内容,我看不出它可能是什么。