我很难用简洁的标题来阐明这个问题,但用一个简单的例子就可以很容易地解释它。
假设我们有一个名为
plum_tree_inspections
的数据库表,它记录了在特定日期检查时,李子树上有多少个李子。想象一下我们的桌子是这样的:
id | 树_id | 日期 | 高度 | 李子计数 |
---|---|---|---|---|
1 | 1234 | 2021 年 3 月 12 日 | 1.3 | 19 |
2 | 678 | 2021 年 3 月 13 日 | 2.8 | 16 |
3 | 1234 | 2022 年 3 月 10 日 | 1.5 | 26 |
4 | 678 | 2022 年 3 月 11 日 | 3.2 | 22 |
5 | 1234 | 2023 年 3 月 20 日 | 1.4 | 32 |
6 | 678 | 2023 年 3 月 21 日 | 3.6 | 20 |
然后我想要一个查询,将该表合并到一个汇总表(实际上是一个视图)中,该表为您提供有关每个不同树的信息。这应该包含最早计数日期、最晚计数日期、树曾经达到的最大高度(可能顶部树枝在一年的暴风雨中脱落)、平均李子数量和最近计数的李子数量的列。
我可以对所有这些列使用一个简单的函数,除了从最近计数中获取李子计数的函数之外。 SQL 会是这样的:
SELECT DISTINCT
tree_id,
min(date) AS earliest_date,
max(date) AS latest_date,
max(height) AS max_height,
avg(plum_count) AS avg_plum_count,
????? AS latest_plum_count
FROM plum_tree_inspections
GROUP BY tree_id
上面查询中的
?????
有一些简单的SQL吗?或者是否需要在更复杂的查询中重写?
请注意,我所说的现实世界数据库的检查表中有大约一百万条记录,因此任何解决方案都需要具有相当高的性能(但可以很复杂)。
我想有两种方法:
1.子查询
(
SELECT date
FROM plum_tree_inspections AS pti2
WHERE pti2.tree_id = pti.tree_id
AND pti2.plum_count = (SELECT MAX(plum_count) FROM plum_tree_inspections WHERE tree_id = pti.tree_id)
) AS latest_plum_count
2.窗口函数
MAX(CASE WHEN plum_count = MAX(plum_count) OVER (PARTITION BY tree_id) THEN date END) AS latest_plum_count
两种方法都达到相同的结果,即为每个
max(plum_count)
组查找与 tree_id
对应的日期。