sql - 累计重复次数

标签 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

这相当于 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 Fiddle.

关于sql - 累计重复次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26898156/

相关文章:

php - MYSQL加入帮助。根据单独评论表中的评论数量获取结果?

sql - 从多对多计数

SQL 对分区计数然后按月分组

mysql优化UPDATE JOIN性能指标

java - 一次将SQL脚本执行到oracle db中

MySQL获取最新的对话消息

node.js - 来自 PostgreSQL 错误的环回模型发现

sql - 如何从 bash 脚本格式化 PostgreSQL 查询中的引号

sql - 使用窗口函数 lag() 计算百分比变化

sql - 在没有聚合函数的情况下进行分区,避免分组依据