Уникальный подсчет в нескольких столбцах

Я нахожусь на postgres/greenplum, и у меня есть такой результат запроса:

         e1          |         e2          
 ------------------- | -------------------
 2017-01-01 00:00:00 | 2017-01-02 00:00:00
 2017-01-01 00:00:00 | 
 2017-01-03 00:00:00 | 2017-01-03 00:00:00

Я хочу преобразовать это в следующее:

      timestamp      | e1 | e2 
---------------------+----+----
 2017-01-01 00:00:00 |  2 |  0
 2017-01-02 00:00:00 |  0 |  1
 2017-01-03 00:00:00 |  1 |  1

Здесь первый столбец содержит все уникальные временные метки, а остальные столбцы соответствуют количеству вхождений для каждого события (e1, e2...).

ПРИМЕЧАНИЕ. Набор данных очень большой, поэтому преобразование на стороне приложения требует больших затрат.


person gnuger    schedule 06.01.2017    source источник


Ответы (1)


Вы можете иметь два агрегированных запроса для каждого столбца и использовать полное внешнее соединение для их объединения:

SELECT          COALESCE(e1_timestamp, e2_timestamp), 
                COALESCE(e1_count, 0),
                COALESCE(e2_count, 0)
FROM            (SELECT   e1 AS e1_timestamp, COUNT(*) AS e1_count
                 FROM     mytable
                 GROUP BY e1) e1
FULL OUTER JOIN (SELECT   e2 AS e2_timestamp, COUNT(*) AS e2_count
                 FROM     mytable
                 GROUP BY e2) e2 ON e1_timestamp = e2.timestamp
person Mureinik    schedule 06.01.2017