Python sqlite3 SQL запрос Получить все записи с самой новой датой, но с ограничением на один уникальный столбец - PullRequest
0 голосов
/ 06 мая 2020

У меня есть таблица с именем fileEvents. Он имеет четыре столбца (их больше, но не имеет отношения к вопросу): id, fileId, action и time.

Одинаковые значения fileId, action и time могут отображаться в нескольких строках.

Запрос, который мне нужен, прост, но я не могу придумать рабочий: получить последнюю запись с момента указанного c времени для каждого fileId.

Я пробовал следующее.

Сначала Я постараюсь просто отсортировать все записи по времени, начиная с указанного c time:

SELECT * FROM `fileEvents` ORDER BY `time` DESC WHERE `time` < 1000

Результат, конечно, нормальный (id, action, fileId, time ):

[(6, 0, 3, 810), (5, 0, 3, 410), (2, 0, 1, 210), (3, 0, 2, 210), (4, 0, 3, 210), (1, 0, 1, 200)]

Так все отсортировано. Но теперь мне нужен только уникальный fileId s. So I add a GROUP BY fileId`:

SELECT * FROM `fileEvents` GROUP BY `fileId` ORDER BY `time` DESC WHERE `time` < 1000

Что, конечно, неверно. Потому что сначала он сгруппирует результаты, а затем сортирует их, но они уже сгруппированы, поэтому сортировки нет:

[(3, 0, 2, 210), (4, 0, 3, 210), (1, 0, 1, 200)]

Когда я пытаюсь отменить GROUP BY и ORDER BY, я получаю OperationalError: near «ГРУППА»: синтаксическая ошибка

Также, когда я пытаюсь выполнить подзапрос, где я сначала получаю отсортированный список, а затем группирую их, результат неверен:

SELECT * FROM `fileEvents` WHERE `id` IN (
SELECT `id` FROM `fileEvents` ORDER BY `time` DESC WHERE `time` < 1000
) GROUP BY `fileId`

С (неправильным ) result:

[(1, 0, 1, 200), (3, 0, 2, 210), (4, 0, 3, 210)]

Результат, который я ищу:

[(6, 0, 3, 810), (2, 0, 1, 210), (3, 0, 2, 210)]

Кто-нибудь знает, как я могу получить желаемый результат? Что мне не хватает? Большое спасибо!

Ответы [ 2 ]

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

С функцией окна ROW_NUMBER():

select * -- replace * with the columns that you want in the result
from (
  select *, row_number() over (partition by fileid order by time desc) rn
  from fileevents 
  where time < 1000
) t
where rn = 1
0 голосов
/ 06 мая 2020
• 1000 *
...