sql - 使用分组计算表中多个字段的唯一组合,仅返回汇总行
问题描述
我有一张桌子:
瓦拉 | 阀值 | 日期 | 邮政 | 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]
谢谢你。
解决方案
一种方法用于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;