首页 > 解决方案 > 使用 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。

注意:如果问题有任何问题,请告诉我,可以澄清一下。

标签: sqlclickhouse

解决方案


您认为您的结果是一个中间结果,您希望每个日期从中选择一行。您可以使用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用于演示)。


推荐阅读