SQL: Select Distinct and Max 显示最低值而不是最高值

SQL: Select Distinct and Max shows the lowest value instead of the highest

在我的 table hms_bbr_group 中,因为有多个副本的列 group_id 我正在尝试查询 selecting 最高值 id 每个 group_id,因此 DISTINCT

Table:

1

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

我的SQLselect:

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

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

上获得

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

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

您对 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;