将许多排序组合组合成一个主排序等级

时间:2017-10-02 01:52:24

标签: sql sorting integer

假设我有一个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的值合并为一个“主”排序等级?使用此“主”排序等级对数据集进行排序应该会产生相同的排序。

我在想我可以用点移动做点什么,但我不确定......

2 个答案:

答案 0 :(得分:1)

你的意思是这样吗?

order by x * 10000 + y * 100 + z

(您可以调整所需宽度的数字。)

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

order by x, y, z

如果组合成单个值,请注意整数溢出。

答案 1 :(得分:1)

假设三列中每一列中的每个值在1到5亿之间,您可以使用以下公式生成唯一排名: 百万     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。除此之外,拥有1 bil x 1 bil的记录将会产生一个非常大的桌子,并会产生其他问题。