简体   繁体   English

从多列的 SUM() 中选择并加入 postgreSQL

[英]Select from SUM() of multiple columns and join in postgreSQL

I have a table called DETAILS which has 5 numeric columns DETAILS(id, key2, key3, num1, num2, num3, num4, num5).我有一个名为 DETAILS 的表,它有 5 个数字列 DETAILS(id, key2, key3, num1, num2, num3, num4, num5)。 Combination of id, key2 and key3 is the primary key. id、key2 和 key3 的组合是主键。 Each id may have multiple rows.每个 id 可能有多行。

My requirement is to get top 10 SUM values of each column grouped by id as below.我的要求是获取按 id 分组的每列的前 10 个 SUM 值,如下所示。

select   id
        ,sum(num1) val1
 from details   
group by id
order by sum(num1) desc nulls last
limit 10;

select   id
        ,sum(num2) val2
 from details  
group by id
order by sum(num2) desc nulls last
limit 10;

select   id
        ,sum(num3) val3
 from details   
group by id
order by sum(num3) desc nulls last
limit 10;

select   id
        ,sum(num4) val4
 from details   
group by id
order by sum(num4) desc nulls last
limit 10;

select   id
        ,sum(num5) val5
 from details
group by id
order by sum(num5) desc nulls last
limit 10;

I need the above results to be combined based on the id as below我需要根据下面的 id 组合上述结果

id, sum(num1), sum(num2), sum(num3), sum(num4), sum(num5)

Lets say the first query returns假设第一个查询返回

[{id: 1, val1: 50}, {id: 2, val1: 60}, {id: 3, val1: 70}]

the second query returns第二个查询返回

[{id: 3, val2: 150}, {id: 4, val2: 160}, {id: 3, val2: 170}]

The result should be结果应该是

[
{id: 1, val1: 50, val2: null}, 
{id: 2, val1: 60, val2: null}, 
{id: 3, val1: 70, val2: 150},
{id: 4, val1: null, val2: 160},
{id: 5, val1: null, val2: 170},
]

Is this possible with single query using join or something?这可以通过使用 join 或其他方式的单个查询实现吗? If so how do I achieve this with a optimised query?如果是这样,我如何通过优化查询来实现这一点?

I think that you want a FULL OUTER JOIN of all 5 queries:我认为您需要对所有 5 个查询进行 FULL OUTER JOIN:

with
  cte1 as (
    select id, sum(num1) val1 from details   
    group by id
    order by sum(num1) desc nulls last limit 10
  ),
  cte2 as (
    select id, sum(num2) val2 from details   
    group by id
    order by sum(num2) desc nulls last limit 10
  ),  
  cte3 as (
    select id, sum(num3) val3 from details   
    group by id
    order by sum(num3) desc nulls last limit 10
  ),  
  cte4 as (
    select id, sum(num4) val4 from details   
    group by id
    order by sum(num4) desc nulls last limit 10
  ),  
  cte5 as (
    select id, sum(num5) val5 from details   
    group by id
    order by sum(num5) desc nulls last limit 10
  )
select coalesce(c1.id, c2.id, c3.id, c4.id, c5.id) id,
       c1.val1, c2.val2, c3.val3, c4.val4, c5.val5
from cte1 c1
full outer join cte2 c2 on c2.id = c1.id
full outer join cte3 c3 on c3.id = c2.id
full outer join cte4 c4 on c4.id = c3.id
full outer join cte5 c5 on c5.id = c4.id

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM