【问题标题】:SQL: Select Distinct and Max shows the lowest value instead of the highestSQL:选择 Distinct 和 Max 显示最低值而不是最高值
【发布时间】:2021-09-23 23:59:36
【问题描述】:

在我的表hms_bbr_group 中,因为group_id 列有多个副本,我试图让查询选择每个group_id 的最大值id,因此是DISTINCT

表:

1

例如,我希望我的查询只显示 id 61group_id 36group_name Infection Control,而忽略其他 ID,因为我只想要最高值

我的 SQL 选择:

SELECT DISTINCT ON (hbg.group_id)
    MAX(hbg.id) AS id,
    hbg.group_id,
    hbg.group_name,
    hbg.group_description,
    hbg.group_type_id,
    hbgt.group_type_name,
    hbg.category_id,
    hbg.effective_start_datetime,
    hbg.created_by,
    hbg.created_datetime,
    hbg.archived_by,
    hbg.archived_datetime
FROM 
    hms_bbr_group hbg
LEFT JOIN 
    hms_bbr_group_type hbgt ON (hbg.group_type_id = hbgt.group_type_id)
GROUP BY 
    hbg.group_id, hbg.group_name, hbg.group_description, 
    hbg.group_type_id, hbgt.group_type_name, hbg.category_id, 
    hbg.effective_start_datetime, hbg.created_by, 
    hbg.created_datetime, hbg.archived_by, hbg.archived_datetime 
ORDER BY 
    hbg.group_id ASC;

这里重要的几行是

DISTINCT ON (hbg.group_id)
MAX(hbg.id) AS id

我的问题是输出显示了最低的 id 值:

SQL 查询:

2

正如您从第一个屏幕截图中看到的那样,我得到的是id 36(最低)而不是group_id 36(最高)上的id 61

为了测试它,我尝试将 MAX 替换为 MIN,但输出仍然相同。

为什么我的 SQL 没有显示 MAX id 值?

【问题讨论】:

  • 我添加了postgresql 标签,据我所知,它是唯一提供distinct on()的DBMS

标签: sql postgresql select max distinct


【解决方案1】:

您对DISTINCT ON 的使用不正确,您无需在此处使用GROUP BY。只需在 select 子句的括号中列出用于考虑每个组的列。然后在ORDER BY 子句中重复该列first,然后是用于选择每个组中第一条记录的列。

SELECT DISTINCT ON (hbg.group_id)
    hbg.group_id,
    hbg.id AS id,
    hbg.group_name,
    hbg.group_description,
    hbg.group_type_id,
    hbgt.group_type_name,
    hbg.category_id,
    hbg.effective_start_datetime,
    hbg.created_by,
    hbg.created_datetime,
    hbg.archived_by,
    hbg.archived_datetime
FROM hms_bbr_group hbg
LEFT JOIN hms_bbr_group_type hbgt
    ON hbg.group_type_id = hbgt.group_type_id
ORDER BY
    hbg.group_id,
    hbg.id DESC;

【讨论】:

  • 谢谢你把事情弄清楚,不需要MAX,因为ORDER BY hbg.id DESC正在读取最高值的id?
  • 是的,但不要以为只选择MAX就限制了最大ID记录;它没有。我上面发布的替代方法是使用ROW_NUMBER,这是一个完全不同的查询。如果你想要一个 GROUP BYMAX 方法,那么你必须加入一个子查询,它可以找到每个组的最大值。
  • 感谢您的快速课程,这对您有很大帮助
  • @GetSomeHelp 这就是这个网站的全部内容。很好的帮助,高质量的答案。欢迎使用 Stack Overflow!
猜你喜欢
  • 2017-04-13
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 2020-12-31
相关资源
最近更新 更多