从多个列的SUM()中选择并加入postgreSQL [英] Select from SUM() of multiple columns and join in postgreSQL

查看:202
本文介绍了从多个列的SUM()中选择并加入postgreSQL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个名为DETAILS的表,该表具有5个数字列DETAILS(id,key2,key3,num1,num2,num3,num4,num5). id,key2和key3的组合是主键.每个ID可能有多行.

I have a table called DETAILS which has 5 numeric columns DETAILS(id, key2, key3, num1, num2, num3, num4, num5). Combination of id, key2 and key3 is the primary key. Each id may have multiple rows.

我的要求是获取按ID分组的每列的前10个SUM值,如下所示.

My requirement is to get top 10 SUM values of each column grouped by id as below.

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;

我需要根据以下ID将上述结果合并

I need the above results to be combined based on the id as below

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

说 第一个查询返回

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

第二个查询返回

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

结果应该是

[
{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},
]

使用join或其他查询进行单个查询是否有可能?如果是这样,如何通过优化查询来实现?

Is this possible with single query using join or something? If so how do I achieve this with a optimised query?

推荐答案

我认为您希望对所有5个查询进行FULL OUTER JOIN:

I think that you want a FULL OUTER JOIN of all 5 queries:

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

这篇关于从多个列的SUM()中选择并加入postgreSQL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆