假设我有一个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
x
,y
和z
是排序等级。这些排序总是大于0,小于500mil。
有没有办法将x
,y
和z
的值合并为一个“主”排序等级?使用此“主”排序等级对数据集进行排序应该会产生相同的排序。
我在想我可以用点移动做点什么,但我不确定......
答案 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;
通过检查z
和y
列,可以看出其工作原理。来自z
的最大值为5亿,保证小比y
中的最小值<10>。这个逻辑适用于整个公式。这种方法类似于使用位掩码,更大规模。
请注意,我假设您的SQL版本可以容忍这么大的数字。如果没有,那么你可能想在这里考虑另一种方法,可能只是在他的回答中提到的@Gordon。除此之外,拥有1 bil x 1 bil的记录将会产生一个非常大的桌子,并会产生其他问题。