postgres / sql сам объединяются, сравнивая строки - PullRequest
0 голосов
/ 02 октября 2019

У меня есть следующий пример таблицы

id, label, reason, timestamp
7, 123, ok, 10:50:01
6, 124, reject, 10:53:01
5, 123, reject, 10:30:02
4, 124, ok, 10:30:01

Я хотел бы получить строки, в соответствии с которыми, если последняя запись метки (последняя отметка времени) в порядке, мы отображаем ее в результатах, но если быламы отказываемся.

например

7, 123, ok, 10:50:01

Это должно быть просто, но у меня действительно есть проблемы. Может ли кто-нибудь помочь? Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 02 октября 2019

Я бы предложил distinct on:

select t.*
from (select distinct on (label) t.*
      from t
      order by label, timestamp desc
     ) t
where reason = 'ok';

Вы также можете сделать это как:

select t.*
from t
where t.timestamp = (select max(t2.timestamp)
                     from t t2
                     where t2.label = t.label
                    ) and
      t.reason = 'ok';
0 голосов
/ 02 октября 2019

Здесь мы могли бы использовать некоторую существующую логику:

SELECT id, label, reason, timestamp
FROM yourTable t1
WHERE
    reason = 'ok' AND
    NOT EXISTS (SELECT 1 FROM yourTable t2
                WHERE t2.label = t1.label AND
                      t2.timestamp > t1.timestamp);

Предполагается, что вам нужна соответствующая единственная строка с последней отметкой времени.

0 голосов
/ 02 октября 2019

Вот ваш запрос.

select t1.* from 
  (select row_number() over (order by timestamp desc) as rn
       , id, label, reason, timestamp
   from tableA) as t1 
where t1.rn = 1 and t1.reason = 'ok'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...