【问题标题】:Counting DISTINCT in FULL OUTER JOIN在 FULL OUTER JOIN 中计算 DISTINCT
【发布时间】:2020-03-03 11:43:32
【问题描述】:

我确信有一个简单的解决方案,我的豌豆大脑现在无法理解。

我正在使用带有 FULL OUTER JOIN 的以下查询,我想计算 DISTINCT memberid

SELECT a.year,
       COUNT(DISTINCT a.memberid) AS members
FROM (SELECT DISTINCT YEAR,
             memberid
      FROM (SELECT EXTRACT(YEAR FROM created_at) AS YEAR,
                   EXTRACT(MONTH FROM created_at) AS MONTH,
                   member_id AS memberid,
                   COUNT(DISTINCT field1) AS field1
            FROM table1            
            GROUP BY YEAR,
                     MONTH,
                     member_id
            ORDER BY YEAR,
                     MONTH,
                     eids DESC)) a
  FULL OUTER JOIN (SELECT DISTINCT YEAR,
                          memberid
                   FROM (SELECT EXTRACT(YEAR FROM created) AS YEAR,
                                EXTRACT(MONTH FROM created) AS MONTH,
                                memberid,
                                COUNT(field2) AS field2
                         FROM table2                        
                         GROUP BY YEAR,
                                  MONTH,
                                  memberid
                         ORDER BY YEAR,
                                  MONTH,
                                  questions DESC)) b
               ON a.year = b.year
              AND a.memberid = b.memberid
GROUP BY a.year
ORDER BY a.year

这个查询可以正常执行,但我很确定结果不是我所期望的。

我得到以下结果:

2014    26834
2015    58573
2016    178378
2017    233291
2018    297404
2019    281088

我们现在将FULL OUTER JOIN 两侧的查询称为Left queryRight query。当我在 year 上聚合 Right query 并计算不同的 memberid 时,我得到以下结果:

2013    3915
2014    59025
2015    115514
2016    176528
2017    216675
2018    301007
2019    311141

正如我们所见,Right query 本身的结果 (DISTINCT COUNT) 高于具有 FULL OUTER JOIN 的完整查询。这显然没有意义。

在我的最终结果中,我想在所有memberid 上运行COUNT DISTINCT(即出现在Left query 中的memberid,加上出现在Right query 中的memberid,没有计算任何memberid 两次)并将其聚合为year

我知道解决这个问题的方法必须很简单。任何帮助将不胜感激。

【问题讨论】:

    标签: sql postgresql amazon-redshift


    【解决方案1】:

    您只计算 a.memberid,这意味着右侧的任何内容都将被忽略。

    要完成这项工作,您应该在左侧和右侧之间进行联合,然后只计算(不同的成员ID)

    【讨论】:

    • 这就成功了。我不知道为什么我之前没有想到 UNION。非常感谢。
    猜你喜欢
    • 2013-03-10
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 2012-02-13
    • 2019-08-07
    • 2021-09-06
    相关资源
    最近更新 更多