【问题标题】:Outer join removing duplicated columns外部连接删除重复的列
【发布时间】:2023-02-04 09:06:39
【问题描述】:

我正在尝试加入通过这样的查询获得的多个数据:

    select 
        TO_VARCHAR(CREATE_TIME, 'yyyy-MM') as YEAR_MONTH,
        COUNT(1) as DESIRED_VALUE
    from
        MY_TABLE
    where 
        FIELD = 'DESIRED_VALUE'
    group by 1;

这导致数据如下:

YEAR     DESIRED_VALUE1
2022-09  52
2022-10  117
2022-11  95
2023-01  73
YEAR_MONTH  DESIRED_VALUE2
2022-11     35
2022-12     30
2023-01     29

我想以这样的表格结束:

YEAR_MONTH  DESIRED_VALUE1  DESIRED_VALUE2
2022-09     52              NULL
2022-10     117             NULL
2022-11     95              35
2022-12     53              30 
2023-01     73              29

我不知道每个查询将返回哪些日期,如果这有意义的话,所以我无法推断它是否是左连接,例如。所以我正在做一个完整的

with result_1 as 
    (
        query1
    ),
result_2 as 
    (
        query2
    ) 
select * 
from 
    result_1 
full outer join result_2
on  
    result_1.YEAR_MONTH = result_2.YEAR_MONTH

这给了我这个:

YEAR_MONTH  DESIRED_VALUE2  YEAR_MONTH_2    DESIRED_VALUE1
2023-01     29              2023-01         73
NULL        NULL            2022-10         117
2022-11     35              2022-11         95
NULL        NULL            2022-09         52
2022-12     30              NULL            NULL

但我想显示一个 YEAR MONTH 列,它显示所有现有值:

YEAR_MONTH  DESIRED_VALUE2 DESIRED_VALUE1
2023-01     29             73
2022-10     NULL           117
2022-11     35             95
2022-09     NULL           52
2022-12     30             NULL                           

为了解决这个问题,我使用:

COALESCE(DESIRED_VALUE1.YEAR_MONTH, DESIRED_VALUE2.YEAR_MONTH) as YEAR_MONTH

但是,如果我添加更多数据:

with result_1 as 
    (
        select 
            TO_VARCHAR(CREATE_TIME, 'yyyy-MM') as YEAR_MONTH,
            COUNT(1) as DESIRED_VALUE1
        from
            MY_TABLE
        where 
            STATUS = 'DESIRED_VALUE1'
        group by 1
    ),
result_2 as 
    (
        select 
            TO_VARCHAR(CREATE_TIME, 'yyyy-MM') as YEAR_MONTH,
            COUNT(1) as DESIRED_VALUE2
        from
            MY_TABLE
        where 
            STATUS = 'DESIRED_VALUE2'
        group by 1
    ), 
result3 as 
    (
        select 
            TO_VARCHAR(CREATE_TIME, 'yyyy-MM') as YEAR_MONTH,
            COUNT(1) as DESIRED_VALUE3
        from
            MY_TABLE
        where 
            STATUS = 'DESIRED_VALUE3'
        group by 1
    )
select 
    COALESCE(DESIRED_VALUE1.YEAR_MONTH, DESIRED_VALUE2.YEAR_MONTH, DESIRED_VALUE3.YEAR_MONTH) as YEAR_MONTH,
    DESIRED_VALUE1,
    DESIRED_VALUE2,
    DESIRED_VALUE3
from 
    result_1 
full outer join 
    result_2
on  
    result_1.YEAR_MONTH = result_2.YEAR_MONTH
full outer join 
    result_3
on
    result_2.YEAR_MONTH = result_3.YEAR_MONTH
order by YEAR_MONTH desc; 

我开始重复YEAR_MONTH

YEAR_MONTH  DESIRED_VALUE1  DESIRED_VALUE2  DESIRED_VALUE3
2023-01     73              29              83
2022-12     53              30              57
2022-11     95              35              71
2022-10     NULL            39              NULL        
2022-10     117             NULL            NULL    
2022-09     18              NULL            NULL    
2022-09     52              NULL            NULL    

我不确定解决此问题的最佳方法是什么。

【问题讨论】:

  • 您使用的是哪个数据库系统。请标记它
  • 完成,fyi 雪花。谢谢@nbk。

标签: sql duplicates snowflake-cloud-data-platform outer-join coalesce


【解决方案1】:

尝试这个

;with cte(date, value1, value2) as(
select date, value1, null from query1
union
select date, null, value2 from query2
)
select date
    , sum(value1)
    , sum(value2)
from cte
group by date

【讨论】:

    【解决方案2】:

    如果正确理解你想要完成的事情,那么直接说会不会更简单(而且性能更高)

    select to_varchar(CREATE_TIME, 'yyyy-MM')                         as YEAR_MONTH,
           sum( case STATUS when 'DESIRED_VALUE1' then 1 else 0 end ) as DESIRED_VALUE1,
           sum( case STATUS when 'DESIRED_VALUE2' then 1 else 0 end ) as DESIRED_VALUE2,
           sum( case STATUS when 'DESIRED_VALUE3' then 1 else 0 end ) as DESIRED_VALUE3
    from MY_TABLE
    where STATUS in ('DESIRED_VALUE1, DESIRED_VALUE2, DESIRED_VALUE3 )
    group by 1
    order by 1
    

    【讨论】:

      猜你喜欢
      • 2021-03-20
      • 2017-09-17
      • 2018-02-09
      • 2015-10-22
      • 2012-11-03
      • 2017-06-15
      • 2018-12-15
      • 1970-01-01
      • 2017-07-02
      相关资源
      最近更新 更多