Sql 筛选并比较数组_agg值

Sql 筛选并比较数组_agg值,sql,postgresql,Sql,Postgresql,我有下一个问题: SELECT type, array_agg(DISTINCT food_name) as food, portion FROM stored_meal WHERE id = 23 AND event_timestamp >= '2020-09-01 19:49:38.634483' AND event_timestamp < '2020-09-07 19:49:38.634483' 我需要筛选出具有相同“食物项”和“最低部分”的行

我有下一个问题:

SELECT
     type,
     array_agg(DISTINCT food_name) as food,
     portion
FROM stored_meal
WHERE id = 23
AND event_timestamp >= '2020-09-01 19:49:38.634483'
AND event_timestamp < '2020-09-07 19:49:38.634483'
我需要筛选出具有相同“食物项”和“最低部分”的行 预期结果应为:

type       food                portion
launch     {cola, wine, pizza} 4
breakfast  {burger, pepsi}     5

我是SQL新手,有什么办法吗?

您可以使用窗口函数:

SELECT type, food, portion
FROM (SELECT type, array_agg(DISTINCT food_name) as food, portion,
             ROW_NUMBER() OVER (PARTITION BY array_agg(DISTINCT food_name) ORDER BY portion DESC) as seqnum
      FROM stored_meal
      WHERE id = 23 AND
           event_timestamp >= '2020-09-01 19:49:38.634483' AND
           event_timestamp < '2020-09-07 19:49:38.634483'
     ) sm
WHERE seqnum = 1;

查询没有使用GROUP BY,因此应该失败。这是您的实际代码吗?
SELECT type, food, portion
FROM (SELECT type, array_agg(DISTINCT food_name) as food, portion,
             ROW_NUMBER() OVER (PARTITION BY array_agg(DISTINCT food_name) ORDER BY portion DESC) as seqnum
      FROM stored_meal
      WHERE id = 23 AND
           event_timestamp >= '2020-09-01 19:49:38.634483' AND
           event_timestamp < '2020-09-07 19:49:38.634483'
     ) sm
WHERE seqnum = 1;