SUM() OVER (PARTITION BY) AS - 存在重复项时

Posted

技术标签:

【中文标题】SUM() OVER (PARTITION BY) AS - 存在重复项时【英文标题】:SUM() OVER (PARTITION BY ) AS - When Duplicates Exist 【发布时间】:2020-02-07 13:57:43 【问题描述】:

在我有重复记录的地方使用 SUM() OVER(PARTITION BY) 时遇到问题。我可以使用 DISTINCT 删除重复项,但 SUM 仍对所有重复记录执行。

例如我的数据是:

--------------------------------------
|ref    |CODES  |VALUE  |SUM         |
--------------------------------------
|101    |CODE1  |20     |150         |
|101    |CODE2  |30     |150         |
|101    |CODE1  |20     |150         |
|101    |CODE2  |30     |150         |
|101    |CODE1  |20     |150         |
|101    |CODE2  |30     |150         |

应用 DISTINCT 后,它变为:

--------------------------------------
|ref    |CODES  |VALUE  |SUM         |
--------------------------------------
|101    |CODE1  |20     |150         |
|101    |CODE2  |30     |150         |

所以问题是我希望 SUM 列是 50。

SUM 码是:

SUM(value) OVER (PARTITION BY ref) AS Total

我想看看:

--------------------------------------
|ref    |CODES  |VALUE  |SUM         |
--------------------------------------
|101    |CODE1  |20     |50          |
|101    |CODE2  |30     |50          |

感谢任何建议。谢谢。

【问题讨论】:

请向我们展示您期望的结果。您希望结果集中有 2 条记录,还是 6 条? 为防止误解,您是否使用 Microsoft sql server 作为 DMBS?请添加您的 rdmbs 的适当标签。 首先删除表中的重复项而不是在使用该表的每个查询中进行补偿不是更有意义吗? 【参考方案1】:

您可以先在子查询中select distinct,然后进行窗口求和:

select ref, codes, value, sum(value) over(partition by ref) total
from (select distinct ref, codes, value from mytable) t

这将产生一个包含 2 条记录和 total50 的结果集。

【讨论】:

嗨,我对此做了一些调整,以提供我需要的东西。谢谢。【参考方案2】:

我会使用分组:

select ref, codes, value, sum(value) over(partition by ref) total_sum
from test
group by ref, codes, value;

如果它不适合您的情况,请解释原因。 在此示例中,表名称为test。 Here is a DEMO

【讨论】:

以上是关于SUM() OVER (PARTITION BY) AS - 存在重复项时的主要内容,如果未能解决你的问题,请参考以下文章

Oracle - SELECT DENSE_RANK OVER(ORDER BY、SUM、OVER 和 PARTITION BY)

DB2——sum over partition by 的用法

SUM OVER PARTITION BY 2 最后一行相同的值

在mysql中使用sum() over(Partition by)组合多行数据

BigQuery 缺少 SUM OVER PARTITION BY 的行

Hive 问题 - Rank() OVER (PARTITION BY Dept ORDER BY sum(salary))