首页 > 解决方案 > 使用分组计算表中多个字段的唯一组合,仅返回汇总行

问题描述

我有一张桌子:

瓦拉 阀值 日期 邮政 VALC
一个 C 2021 年 4 月 1 日 10001 D
一个 2021 年 4 月 1 日 10001 一个
一个 一个 2021 年 3 月 1 日 10001 一个
一个 一个 2021 年 3 月 1 日 10001
一个 2021 年 3 月 1 日 10001 一个
一个 C 2021 年 3 月 1 日 10001 D
一个 2021 年 3 月 1 日 10001 一个
一个 一个 2021 年 4 月 1 日 10002 一个
一个 一个 2021 年 4 月 1 日 10002 一个
一个 C 2021 年 4 月 1 日 10002 D
一个 2021 年 4 月 1 日 10002 一个
一个 一个 2021 年 3 月 1 日 10002 一个
一个 一个 2021 年 3 月 1 日 10002 一个
一个 一个 2021 年 3 月 1 日 10002 一个
一个 一个 2021 年 3 月 1 日 10002 一个
一个 C 2021 年 3 月 1 日 10002 D
一个 2021 年 3 月 1 日 10002 一个

我需要以下格式的结果集:

邮政 日期 数数
10001 2021 年 3 月 1 日 5
10001 2021 年 4 月 1 日 2
10002 2021 年 3 月 1 日 3
10002 2021 年 4 月 1 日 3

我试过的:

SELECT [POST]
,[DATE]
,COUNT(*) OVER(PARTITION BY [POST]) AS [COUNT]
FROM [TABLE]
GROUP BY [POST], [DATE]

问题在于:缺少获取VALA、VALB、VALC 字段的唯一组合计数的逻辑。分组好像没问题,就是不知道怎么继续。

为您提供的虚拟数据:

CREATE TABLE [TABLE] (
    [VALA] varchar(255),
    [VALB] varchar(255),
    [DATE] varchar(255),
    [POST] varchar(255),
    [VALC] varchar(255),
);

INSERT INTO [TABLE]
VALUES
('A', 'A', 'March 1, 2021', 10001, 'A'),
('A', 'A', 'March 1, 2021', 10001, 'B'),
('A', 'B', 'March 1, 2021', 10001, 'A'),
('B', 'A', 'March 1, 2021', 10001, 'A'),
('A', 'C', 'March 1, 2021', 10001, 'D'),
('B', 'A', 'April 1, 2021', 10001, 'A'),
('A', 'C', 'April 1, 2021', 10001, 'D'),
('A', 'A', 'March 1, 2021', 10002, 'A'),
('A', 'A', 'March 1, 2021', 10002, 'A'),
('B', 'A', 'March 1, 2021', 10002, 'A'),
('A', 'C', 'March 1, 2021', 10002, 'D'),
('A', 'A', 'March 1, 2021', 10002, 'A'),
('A', 'A', 'March 1, 2021', 10002, 'A'),
('A', 'A', 'April 1, 2021', 10002, 'A'),
('B', 'A', 'April 1, 2021', 10002, 'A'),
('A', 'C', 'April 1, 2021', 10002, 'D'),
('A', 'A', 'April 1, 2021', 10002, 'A');

SELECT * FROM [TABLE]

谢谢你。

标签: sqlsql-servertsql

解决方案


一种方法用于DENSE_RANK计算三个值列的不同组合的数量。然后,我们可以按日期和发布聚合,并取这个密集排名的最大值。

WITH cte AS (
    SELECT *, DENSE_RANK() OVER (PARTITION BY DATE, POST
                                 ORDER BY [VALA], [VALB], [VALC]) dr
    FROM yourTable
)

SELECT POST, DATE, MAX(dr) AS COUNT
FROM cte
GROUP BY POST, DATE
ORDER BY POST, DATE;

下面演示链接的屏幕截图

演示


推荐阅读