【问题标题】:SQL: ORDER BY based on two columns of interlaced valuesSQL:基于两列交错值的 ORDER BY
【发布时间】:2012-02-15 06:32:10
【问题描述】:

我有一个表格,该表格将根据两列数字(称为 X 列和 Y 列)进行排序。在每一行中,两列可以都有数值(在这种情况下 X

示例数据:

      X     Y
    ----- -----
... NULL   26
...  31   NULL
...   1     7
...  39    46
... NULL   36
...  15    16
... NULL   14
...  23    29

我想对这些数据进行排序,以便列“正确”交错。具体来说:

1) 如果 X 值出现在两行中,则基于 X 排序。

2) 否则,如果 Y 值出现在两行中,则按 Y 排序。

3) 否则,比较可用的 X 值和可用的 Y 值。

示例数据的“正确”排序是:

      X     Y
    ----- -----
...   1     7
... NULL   14
...  15    16
... NULL   26
...  23    29
...  31   NULL
... NULL   36
...  39    46

有没有简单的方法在 ORDER BY 子句中执行这种排序?

【问题讨论】:

  • 你会把... 25 NULL放在哪里?
  • 它将在 23/29 和 31/NULL 之间。如果在两行中都填充,则始终优先按 X 列排序。澄清一下:目标是最终将两列中的每一列中的值相对于该列中的其他值进行排序。由于显而易见的原因,这在 X 列上总是可能的,并且通常可以与 Y 列“接近”——考虑 25/27;它必须在 23/29 之后进行,即使这会导致 Y 列中的小错误排序。

标签: sql sorting sql-order-by


【解决方案1】:

你不能。顺序不明确

简单的集合

5    10
7    null
null 8

可以排序

null 8
5    10
7    null

5    10
7    null
null 8

取决于您开始排序的位置。

如果可能,我会将排序标准更改为“X(如果可用),否则为Y”。然后您可以按照“mu is too short”的建议使用 COALSECE 运算符。 (order by coalesce(x, y))

【讨论】:

  • 是的,最终顺序取决于哪些行与哪些其他行进行比较,因此它不是整个集合的属性,它是“排序”过程的产物。很好的反例。
  • 我担心可能是这种情况。您能否就一种合理的方式使排序操作具有传递性提供任何建议?例如,正如您所展示的,可以为特定数据集选择多个“正确”排序;任何一个对我的目的都同样有效(尽管第一个更符合我正在尝试做的事情的精神)。有没有办法修改我布置的“排序规则”,使其无论输入顺序如何都能提供相同的输出?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多