对于一个看起来像这样的表格
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
这相当于 ORDER BY Value
排序中 Value
的偏移量。
我考虑过通过使用类似的方法计算重复项的数量来做到这一点
SELECT Value, count(*) AS ct FROM table GROUP BY Value";
然后累积结果,但我想这不是最佳方法(我也没有设法相应地组合命令)
如何有效地计算这一点(对于数十万行)?
最佳答案
这对于 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
上的索引将有助于提高性能。
关于sql - 累计重复次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26898156/