postgresql 从每一行中排除max元素

wmvff8tz  于 2023-04-29  发布在  PostgreSQL
关注(0)|答案(3)|浏览(117)

我写了sql

select array_agg(id) as ids
from fff
group by a_c_id, a_c_dttm, a_c_code
having COUNT(*)>1

返回结果

{5,9}
{8,12,13}
{6,10}
{7,11}

如何排除每一行中的最大值以获得此结果?

{5}
{8,12}
{6}
{7}

最终目标是获得以下结果:{5,8,12,6,7}

huus2vyu

huus2vyu1#

将所有ids(组中的max除外)聚合到一个表中:

select array_agg(id) as ids
from my_table
where id not in (
    select max(id)
    from my_table
    group by other_col
);

请注意,单元素组也被排除在外,因此不必单独处理它们。
db<>fiddle.中测试

jv4diomz

jv4diomz2#

使用max window函数过滤出每个组的最大id值,因此您可以按以下方式修改查询:

select array_agg(id) as ids
from 
(
  select *,
    max(id) over (partition by a_c_id, a_c_dttm, a_c_code) maxid
  from table_name
) t
where id <> maxid
group by a_c_id, a_c_dttm, a_c_code

在这里,您不需要having COUNT(*)>1,因为一个值(最大值)被过滤掉了,所以返回的组包含多行。
要将所有id聚合到一行中,只需删除group by子句即可。
see demo

fkaflof6

fkaflof63#

select array_agg(id) as ids
from fff
WHERE ROW_NUMBER() OVER (PARTITION BY a_c_id, a_c_dttm, a_c_code ORDER BY ID DESC) <> 1 
group by a_c_id, a_c_dttm, a_c_code
having COUNT(*) =>1

您可能需要将ROW_NUMBER移动到子查询中,某些平台不允许在WHERE语句中使用。

相关问题