SQL 根据另一列的值获取 GROUP BY 中的列值

问题描述 投票:0回答:1

我很难用简洁的标题来阐明这个问题,但用一个简单的例子就可以很容易地解释它。

假设我们有一个名为

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吗?或者是否需要在更复杂的查询中重写?

请注意,我所说的现实世界数据库的检查表中有大约一百万条记录,因此任何解决方案都需要具有相当高的性能(但可以很复杂)。

sql
1个回答
0
投票

我想有两种方法:

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
对应的日期。

© www.soinside.com 2019 - 2024. All rights reserved.