按名称和最近日期的 return 行分组
Group by name and return row with most recent date
假设您有以下数据:
+-------+--------+------------+
| Name | Rating | Date |
+-------+--------+------------+
| Alice | 4.5 | 01/01/2022 |
| Alice | 4 | 14/12/2021 |
| Alice | 4 | 16/05/2021 |
| Mary | 5 | 05/01/2022 |
| Mary | 4 | 31/01/2022 |
| Bob | 3.5 | 03/02/2022 |
+-------+--------+------------+
按 name
和 return Snowflake 中最新 date
的行进行分组的最佳方法是什么 (ANSI SQL) ?预期输出:
+-------+--------+------------+
| Name | Rating | Date |
+-------+--------+------------+
| Alice | 4.5 | 01/01/2022 |
| Mary | 4 | 31/01/2022 |
| Bob | 3.5 | 03/02/2022 |
+-------+--------+------------+
使用ROW_NUMBER
:
WITH cte AS (
SELECT t.*, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Date DESC) rn
FROM yourTable t
)
SELECT Name, Rating, Date
FROM cte
WHERE rn = 1;
使用 QUALIFY 您可以保留每个名称的最新信息
SELECT *
FROM table
QUALIFY row_number() OVER (PARTITION BY name ORDER BY date desc) = 1;
正如您将在文档中看到的那样,它与蒂姆的答案相同,无需嵌套 select。
假设您有以下数据:
+-------+--------+------------+
| Name | Rating | Date |
+-------+--------+------------+
| Alice | 4.5 | 01/01/2022 |
| Alice | 4 | 14/12/2021 |
| Alice | 4 | 16/05/2021 |
| Mary | 5 | 05/01/2022 |
| Mary | 4 | 31/01/2022 |
| Bob | 3.5 | 03/02/2022 |
+-------+--------+------------+
按 name
和 return Snowflake 中最新 date
的行进行分组的最佳方法是什么 (ANSI SQL) ?预期输出:
+-------+--------+------------+
| Name | Rating | Date |
+-------+--------+------------+
| Alice | 4.5 | 01/01/2022 |
| Mary | 4 | 31/01/2022 |
| Bob | 3.5 | 03/02/2022 |
+-------+--------+------------+
使用ROW_NUMBER
:
WITH cte AS (
SELECT t.*, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Date DESC) rn
FROM yourTable t
)
SELECT Name, Rating, Date
FROM cte
WHERE rn = 1;
使用 QUALIFY 您可以保留每个名称的最新信息
SELECT *
FROM table
QUALIFY row_number() OVER (PARTITION BY name ORDER BY date desc) = 1;
正如您将在文档中看到的那样,它与蒂姆的答案相同,无需嵌套 select。