sql - 使用 group by 查询从表中选择特定行
问题描述
我有一个看起来像这样的表:
+------------+------------+--------------+
| Date | Name | Certificates |
+------------+------------+--------------+
| 2021-02-01 | Jason | 3 |
| 2021-02-01 | Nisha | 4 |
| 2021-02-01 | Zaid | 5 |
| 2021-03-25 | Aniket | 4 |
| 2021-03-25 | Anish | 2 |
| 2021-03-25 | Nadia | 0 |
| 2021-05-06 | Aadil | 7 |
| 2021-05-06 | Ashish | 1 |
| 2021-05-06 | Rahil | 9 |
+------------+------------+--------------+
此结果是通过执行以下 SQL 查询获得的:
SELECT
Date, Name, COUNT(Certificates) as Certificates
FROM Students.data
GROUP BY Date, Name
ORDER BY Date, Name;
收到这个结果后,理想情况下,我现在只想要每个日期的第一个条目(基本上是每个日期的名字),应该是这样的:
+------------+------------+--------------+
| Date | Name | Certificates |
+------------+------------+--------------+
| 2021-02-01 | Jason | 3 |
| 2021-03-25 | Aniket | 4 |
| 2021-05-06 | Aadil | 7 |
+------------+------------+--------------+
有没有办法可以通过查询修改上述组以获得结果,或者我是否需要将此查询的结果传递给其他查询,如果是,该查询将是什么。谢谢。
另外,我使用的数据库是 Clickhouse。
注意:如果问题有任何问题,请告诉我,可以澄清一下。
解决方案
您认为您的结果是一个中间结果,您希望每个日期从中选择一行。您可以使用ROW_NUMBER
它按名称对每个日期的行进行编号,并且只保留日期的第一行(那些编号为 1 的行)。
SELECT date, name, certificates
FROM
(
SELECT
date, name, COUNT(Certificates) AS certificates,
ROW_NUMBER() OVER (PARTITION BY date ORDER BY name) AS rn
FROM students.data
GROUP BY date, name
) numbered
WHERE rn = 1
ORDER BY date;
演示:https : //dbfiddle.uk/?rdbms=mysql_8.0&fiddle=93c3682bda72cb4fe53fbbe8053a8acb(这里使用 MySQL 8,因为 dbfiddle.uk 没有 clickhouse,但是查询是标准 SQL 兼容的,所以我们可以使用几乎所有现代 RDBMS用于演示)。
推荐阅读
- angular5 - Angular5中的(单击)和(更改)有什么区别?
- java - 使用 2 个堆栈评估无符号整数的中缀表达式并得到错误答案
- vba - 连接字符串后执行命令
- batch-file - NetWare:包含来自 FTP 服务器的多个点的 MGET 文件名
- angular - 数组值返回g索引:值
- javascript - 如何在 dart 中使用 javascript 库
- configuration - 如何使用 MAC 参数在 OpenWRT 路由器的 iptables 中为特定机器打开 80 端口
- python - Numpy [...,无]
- java - 硒警报认证
- assembly - 汇编 x86 无限循环问题 MOV CX, 12 后程序 RET