【问题标题】:SUM() OVER (PARTITION BY ) AS - When Duplicates ExistSUM() OVER (PARTITION BY) AS - 存在重复项时
【发布时间】: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 的适当标签。
  • 首先删除表中的重复项而不是在使用该表的每个查询中进行补偿不是更有意义吗?

标签: sql sql-server sum duplicates window-functions


【解决方案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;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多