как вернуть значения на основе двух самых ранних дат каждого значения - PullRequest
0 голосов
/ 07 мая 2020

Если бы у меня была таблица:

id | value | time(timestamp datatype)
 0     10     12:33:09 2019-04-01
 1     10     15:33:03 2019-04-01
 2     20     11:20:33 2019-04-01
 3     30     03:32:11 2019-04-01
 4     10     01:22:32 2019-04-01
 5     20     14:34:31 2019-04-01

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

Нравится это:

value | time
  10    12:33:09 2019-04-01
  10    15:33:03 2019-04-01
  20    11:20:33 2019-04-01
  20    14:34:31 2019-04-01

В нашем случае мы вернули две десятки и двадцатку, поскольку это единственные значения с минимум двумя записями. Мы также выбрали id: 0 и 1 в качестве наших 10, потому что это были самые последние значения для ввода.

Я хочу знать, был ли быстрый запрос для этого, потому что все, о чем я могу думать, это вложенные MAX () <1 л oop, что я считаю действительно неэффективным. </p>

1 Ответ

0 голосов
/ 07 мая 2020

Используйте оконные функции:

select t.*
from (select t.*, count(*) over (partition by value) as cnt,
             row_number() over (partition by value order by time desc) as seqnum
      from t
     ) t
where cnt >= 2 and seqnum <= 2;

Или используйте коррелированный подзапрос:

select t.*
from t
where t.time <= (select t2.time
                 from t t2
                 where t2.value = t.value
                 order by t2.time desc
                 limit 1 offset 1
                );

Подзапрос возвращает NULL, если есть только одна строка, поэтому он возвращает две строки только когда есть две строки - ну, если предположить, что время уникально для каждого значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...