【问题标题】:Combining many sort ranks into one master sort rank将多个排序等级组合成一个主排序等级
【发布时间】:2017-10-02 01:52:23
【问题描述】:

假设我有一些来自 SQL 查询的排序结果,如下所示:

x y z 
0 0 0 
0 0 1 
0 0 2
0 1 0
0 1 1 
0 2 0
0 2 1 

其中xyz 是排序等级。这些排序等级总是大于 0,小于 500mil。


有没有办法将xyz 中的值组合成一个“主”排序等级?使用此“主”排序等级对数据集进行排序应该会产生相同的排序。

我想我可以通过位移来做点什么,但我不确定......

【问题讨论】:

  • 您使用的是哪个版本的 SQL(例如 MySQL、SQL Server、Postgres 等)?
  • @TimBiegeleisen 虽然我打算在 SQL 数据库上实现它,但我只是为了示例而说“SQL”。我正在寻找一个通用的解决方案,忽略 SQL 的限制。我也可以在 Pandas 中实现它。

标签: sql sorting integer


【解决方案1】:

假设三列中每一列的每个值都在 1 到 5 亿之间,您可以使用以下公式生成唯一排名: 1000000 z + (500 x 10^6)*y + (500 x 10^6)*(500 x 10^6)*x

要生成此排名,您可以使用以下查询:

SELECT
    x, y, z,
    z + (500 * 1000000)*y + (500 * 1000000)*(500 * 1000000)*x AS master_rank
FROM yourTable;

通过检查 zy 列可以看出其工作原理。 z中的最大值为5亿,保证小于y中的最小值10亿。这个逻辑适用于整个公式。这种方法类似于在更大范围内使用位掩码。

请注意,我假设您的 SQL 版本可以容忍这么大的数字。如果没有,那么您可能想在这里考虑另一种方法,可能只是按照@Gordon 在他的回答中提到的那样订购。除此之外,拥有 10 亿 x 10 亿条记录会使表变得非常大,并且还会出现其他问题。

【讨论】:

    【解决方案2】:

    你的意思是这样的吗?

    order by x * 10000 + y * 100 + z
    

    (您可以根据需要调整数字。)

    我不确定您为什么要这样做而不是:

    order by x, y, z
    

    如果您确实合并为一个值,请注意整数溢出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-18
      • 1970-01-01
      • 2020-05-03
      • 2019-05-24
      • 2013-11-10
      • 2011-08-10
      相关资源
      最近更新 更多