重复的累计数量

时间:2014-11-12 22:46:14

标签: sql postgresql window-functions

对于看起来像

的表格
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";

然后累积结果,但我想这不是最佳方式(也没有设法相应地组合命令)

如何有效地计算(几十万行)?

2 个答案:

答案 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上的索引有助于提升绩效。

SQL Fiddle.

答案 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

请注意自我加入。