Исключить строки на основе созданной отметки времени - PullRequest
0 голосов
/ 22 мая 2018

Мне нужна помощь в преобразовании этой таблицы с разными uuids для одних и тех же электронных писем и получении только строки с min (timestamp), исключая другие

Пример данных:

UUID   email       created_timestamp  
  1    a@g.com        2017-05-01
  2    a@g.com        2018-05-01
  3    a@g.com        2018-05-20
  4    b@g.com        2017-04-01
  5    b@g.com        2017-06-01

Ожидаемый результат:

UUID   email       created_timestamp 
  1    a@g.com        2017-05-01
  4    b@g.com        2017-04-01

Я пытался использовать группирование по, но это делает меня группировать по UUID, что в этом случае не имеет смысла

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Вы можете использовать предложение LIMIT с subquery:

select t.* 
from table t
where UUID = (select UUID
              from table t1
              where t1.email = t.email
              order by created_timestamp asc
              limit 1
             );

Однако, если created_timestamp не имеет дубликатов, вы можете выразить это как:

select t.* 
from table t
where created_timestamp = (select min(created_timestamp)
                           from table t1
                           where t1.email = t.email
                           );
0 голосов
/ 22 мая 2018

Я думаю, что лучший способ в Postgres - это distinct on:

select distinct on (email) t.*
from t
order by email, created_timestamp desc;

В частности, с индексом (email, created_timestamp) это должно быть самое быстрое решение.

0 голосов
/ 22 мая 2018
SELECT
  *
FROM
(
  SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY email
                           ORDER BY created_timestamp
                      )
                        AS SequenceID
  FROM
    yourTable
)
  sorted
WHERE
  SequenceID = 1
...