Подсчет DISTINCT в полном внешнем соединении - PullRequest
0 голосов
/ 07 ноября 2019

Я уверен, что есть простое решение, которое мой гороховый мозг не может понять прямо сейчас.

Я использую следующий запрос с 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 query и Right query. Когда я агрегирую Right query на year и подсчитываю различные memberid, я получаю следующие результаты:

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

Как мы видим, результаты (DISTINCT COUNT) для Right query Сам по себе выше, чем полный запрос, имеющий FULL OUTER JOIN. Это явно не имеет смысла.

В моем конечном результате я хотел бы запустить COUNT DISTINCT на ВСЕХ memberid (то есть memberid, которые появляются в Left query, плюс memberid, которые появляются в Right query, без учета каких-либо memberid дважды) и сгруппировать его по year.

Я знаю, что решение должно быть простым. Любая помощь будет высоко ценится.

1 Ответ

3 голосов
/ 07 ноября 2019

Вы считаете только a.memberid, что означает, что все с правой стороны игнорируется.

Чтобы сделать эту работу, вы должны сделать объединение между левой и правой стороной, а затем просто сосчитать (отличный memberid)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...