重复的累积计数

Posted

技术标签:

【中文标题】重复的累积计数【英文标题】:Cumulative count of duplicates 【发布时间】:2014-11-12 22:46:13 【问题描述】:

对于一个看起来像的表

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

这相当于ValueORDER BY Value 排序中的偏移量。

我已经考虑通过计算重复的数量来做到这一点

SELECT Value, count(*) AS ct FROM table GROUP BY Value";

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

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

【问题讨论】:

【参考方案1】:

对于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 在窗口函数之后应用。此相关答案中的详细信息:

Best way to get result count before LIMIT was applied

结果完全符合要求。value 上的索引将有助于提高性能。

SQL Fiddle.

【讨论】:

难以置信。我不会想到命令/功能存在!非常感谢你。 rank() 对于我尝试的结果来说甚至更好,所以一切都很棒!【参考方案2】:

如果您对窗口功能不满意,您也可以试试这个:

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

注意自加入。

【讨论】:

以上是关于重复的累积计数的主要内容,如果未能解决你的问题,请参考以下文章

SQL 累积不重复计数

Spark SQL 的累积非重复计数

从 Pandas 数据框中另一个系列分段的日期累积计数创建增量计数

SQL Server - 每季度不同客户的运行计数

累积条件计数

两个值匹配 pandas 时的累积计数