【问题标题】:Need help with complex sorting in SQL需要有关 SQL 中复杂排序的帮助
【发布时间】:2010-12-10 01:43:36
【问题描述】:

我的 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)。

结果应该是这样的。

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

如何在 SQL 中执行此操作?

【问题讨论】:

    标签: sql sql-server tsql sorting


    【解决方案1】:

    编辑:感谢 cmets。

    重读时,我认为您问题的第 3 部分没有意义。步骤1)的结果没有按时间排序,不能按时间插入。

    例如,在您的示例结果中,第二行的时间为 1015,即在 0900 和 1030 之间。但它也可能在 1020 和 1010 行之间?

    【讨论】:

    • 会不会按照他的结果把第三、第四和第五排错顺序(按序号排序,因为值是'')。
    • 这会将第 3 行放在第 2 行之前
    【解决方案2】:

    不幸的是,我认为你不能用标准的 SQL 查询来做到这一点,原因是你的算法不是面向集合的。您的示例数据集说明了这一点 - 您的第一个“P”记录显示在 0900 和 1030 记录之间,但根据您的标准将它放在 1010 和 1045 记录之间也是合适的。如果将它放在您显示的位置是正确的,您需要将您的条件修改为“将 #2 的每一行放在 #1 的前两行之间,及时将其括起来”,其中定义了“first”按照#1的排序标准。

    结果是这种类型的设置可能会迫使您使用基于光标的解决方案。如果您可以确定要订购的复合值,您也许可以避免这种情况,但根据您上面的内容,我看不出那可能是什么。

    【讨论】:

      【解决方案3】:

      您似乎可以用更简单的需求来表达您的需求。
      您总是按时间排序,也可能按值排序,然后按编号。

          sort by time, value, no
      

      这将按时间对所有内容进行排序。对于两个相同的时间,将应用对值的排序,等等。


      您可以根据您构建的唯一编号进行排序以结合您的标准。但这会更复杂。

      【讨论】:

        猜你喜欢
        • 2010-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多