Я уверен, что есть простое решение, которое мой гороховый мозг не может понять прямо сейчас.
Я использую следующий запрос с 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
.
Я знаю, что решение должно быть простым. Любая помощь будет высоко ценится.