簡體   English   中英

Postgres嵌套查詢單表

[英]Postgres Nested Query for single table

我被困在一個嵌套的數據庫查詢上。 我能得到一些幫助嗎?

我的簡單表如下所示:

食物表:

+----+----------+-------------------------------+
| ID | NAME     | nutrientName  | NutrientAmount
+----+----------+---------------+---------------+
        food1       calcium            200
        food1       magnesium          300
        food1       phosphorus         400
        food2       calcium            220
        food2       magnesium          320
        food2       phosphorus         430
        food3       calcium            230
     .............

我用它來獲得前 15 名的營養量:

select NAME from food_table
    where nutrientName in ('calcium','magnesium')
        group by NAME
     order by sum(nutrient_amount) desc
limit 15;

目前,我只有 NAME。 但是,我想以相同的順序獲得食物的所有營養。 如果我再做一個 select,訂單就會丟失。 有沒有辦法以相同的順序獲取食物記錄?

編輯:我創建了一個小提琴:

https://www.db-fiddle.com/f/2HkVZPbTxkRNaNpDjT35iM/3

一種方法是使用 window 函數:

select ft.*
from (select ft.*,
             row_number() over (partition by name order by nutrient_amount desc) as seqnum
      from food_table ft
      where nutrientName in ('calcium','magnesium')
     ) ft
where seqnum = 1
order by nutrient_amount desc;

以上以單一營養素的最高量返回營養素。 如果你想要兩者兼得,那么:

select ft.*
from (select ft.*,
             sum(nutrient_amount) over (partition by name order by nutrient_amount desc) as sum_nutrient_amount
      from food_table ft
      where nutrientName in ('calcium', 'magnesium')
     ) ft
order by sum_nutrient_amount desc
limit 15;

或者,如果您只想要數量,那么條件聚合可能就是您想要的:

select name,
       sum(case when nutrientName = 'calcium' then nutrient_amount else 0 end) as ca,
       sum(case when nutrientName = 'magnesium' then nutrient_amount else 0 end) as mg
from food_table
group by name
order by (ca + mg) desc
limit 15;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM