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 61
、group_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;
在我的 table hms_bbr_group
中,因为有多个副本的列 group_id
我正在尝试查询 selecting 最高值 id
每个 group_id
,因此 DISTINCT
Table:
1
例如,我希望我的查询只显示 id 61
、group_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;