возвращать неупорядоченные строки - PullRequest
0 голосов
/ 26 сентября 2019

Это реляционная таблица в Postgres.

У меня есть таблица, которая постоянно получает записи.Структура такова:

группа |дата_объекта |ключ |event_tmstmp

  • где group - уникальный идентификатор группы записей.
  • ключ - строка, содержащая дату и время (то есть: 'sometext / some / more / 20190324121233.csv)
  • где дата объекта int целой подстроки ключа (указанное выше значение, поэтому 20190324121233)
  • , где event_tmstp - это время и дата по умолчанию now () при вставке строки

Что я хочу сделать:

  • отсортировать строки по event_tmstmp
  • для каждой группы строк, вернуть все строки, которые "не в порядке" в соответствии с object_date

ex:

'group1' | 20190324121233 | 'sometext/some/more/20190324121233.csv' | 2019-09-26 14:57:12.747638
'group1' | 20190324121234 | 'sometext/some/more/20190324121234.csv' | 2019-09-26 14:58:12.747638
'group1' | 20190324121236 | 'sometext/some/more/20190324121236.csv' | 2019-09-26 15:00:12.747638
'group1' | 20190324121235 | 'sometext/some/more/20190324121235.csv' | 2019-09-26 15:01:12.747638
'group1' | 20190324121237 | 'sometext/some/more/20190324121237.csv' | 2019-09-26 15:02:12.747638
'group1' | 20190324121238 | 'sometext/some/more/20190324121238.csv' | 2019-09-26 15:05:12.747638
'group1' | 20190324121241 | 'sometext/some/more/20190324121241.csv' | 2019-09-26 15:06:12.747638
'group1' | 20190324121240 | 'sometext/some/more/20190324121240.csv' | 2019-09-26 15:08:12.747638

Итак, я бы хотел получить следующие строки:

'group1' | 20190324121235 | 'sometext/some/more/20190324121235.csv' | 2019-09-26 15:01:12.747638
'group1' | 20190324121240 | 'sometext/some/more/20190324121240.csv' | 2019-09-26 15:08:12.747638

вот что у меня есть:

SELECT a.*
FROM table_1 AS a
WHERE a.object_date >
      ( SELECT b.object_date
        FROM table_1 AS b
        ORDER BY b.event_tmstmp DESC
        LIMIT 1
      );

, но это возвращает только одну строку, а не для каждого group.

Я думаю, мне нужен раздел по пунктам, чтобы выполнить это.Я прав?

1 Ответ

1 голос
/ 26 сентября 2019

Вы можете использовать lag():

select t.*
from (select t.*,
             lag(object_date) over (order by event_tmstmp) as prev_object_date
      from t
     ) t
where prev_object_date > object_date;
...