【发布时间】:2020-08-21 05:53:39
【问题描述】:
我有一个名为“fileEvents”的表。它有四列(还有更多但与问题无关):id、fileId、action 和 time。
相同的fileId、action和time值可以出现在多行中。
我想要的查询很简单,但我想不出一个可行的查询:获取每个 fileId 自特定时间以来的最新条目。
我尝试了以下方法。
首先,我将尝试从特定时间开始按时间排序所有条目:
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)]
所以一切都已排序。但现在我只想要唯一的fileIds. So I add a GROUP BYfileId`:
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 "GROUP": syntax error
此外,当我尝试进行子查询时,我首先获取排序列表,然后将它们分组,结果是错误的:
SELECT * FROM `fileEvents` WHERE `id` IN (
SELECT `id` FROM `fileEvents` ORDER BY `time` DESC WHERE `time` < 1000
) GROUP BY `fileId`
带有(错误的)结果:
[(1, 0, 1, 200), (3, 0, 2, 210), (4, 0, 3, 210)]
我要找的结果是:
[(6, 0, 3, 810), (2, 0, 1, 210), (3, 0, 2, 210)]
有谁知道我怎样才能得到我想要的结果?我错过了什么? 非常感谢!
【问题讨论】:
标签: sql python-3.x sqlite sql-order-by greatest-n-per-group