对于看起来像
的表格ID | Value
-------------
1 | 2
2 | 10
3 | 3
4 | 2
5 | 0
6 | 3
7 | 3
对于表格中显示的每个Value
,我想计算出Value
更高的ID数量,即
Value | Position
----------------
10 | 0
3 | 1
2 | 4
0 | 6
这相当于Value
排序中ORDER BY Value
的偏移量。
我已经考虑过用
之类的东西来计算重复数量SELECT Value, count(*) AS ct FROM table GROUP BY Value";
然后累积结果,但我想这不是最佳方式(也没有设法相应地组合命令)
如何有效地计算(几十万行)?
答案 0 :(得分:3)
这似乎是window function rank()
(不是相关dense_rank()
)的绝佳机会:
SELECT DISTINCT ON (value)
value, rank() OVER (ORDER BY value DESC) - 1 AS position
FROM tbl
ORDER BY value DESC;
rank()
以1开头,而你的计数从0开始,所以减去1。
添加DISTINCT
步骤(此处DISTINCT ON
稍微便宜一点)删除重复行(在计算计数排名后)。在窗口函数之后应用DISTINCT
。这个相关答案的细节:
结果完全符合要求
value
上的索引有助于提升绩效。
答案 1 :(得分:1)
如果您对窗口功能不满意,也可以尝试使用此功能:
SELECT t1.value, COUNT(DISTINCT t2.id) AS position
FROM tbl t1 LEFT OUTER JOIN tbl t2
ON t1.value < t2.value
GROUP BY t1.value
请注意自我加入。