Python sqlite3 SQL查询获取具有最新日期但每个唯一列的限制的所有条目

问题描述 投票:1回答:1

我有一个名为'fileEvents'的表。它有四列(还有更多但与问题无关):id,fileId,操作和时间。

相同的fileId,操作和时间值可以显示在多行中。

我想要的查询很简单,但是我想不到一个可行的查询:从每个文件ID的特定时间起获取最新条目。

我尝试了以下操作。

首先,我将尝试获取自特定时间以来按时间排序的所有条目:

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

结果当然很好(idactionfileIdtime):

[(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时,在“ GROUP”附近出现OperationalError:语法错误

此外,当我尝试执行子查询时,首先获取排序列表,然后将其分组,结果是错误的:

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
1个回答
0
投票

此前1个分组问题的典型解决方案是使用相关子查询进行过滤:

select fe.* 
from fileevents fe
where fe.time = (
    select max(fe1.time) 
    from fileevents fe1 
    where fe1.fileid = fe.fileid and fe1.time < 1000
)

为了提高此查询的性能,您需要在(fileid, time)上建立索引。

© www.soinside.com 2019 - 2024. All rights reserved.