1

所以基本上,这是我拥有的一个 SQLite3 表: 点击这里查看图片

如图所示,有 8 个不同的日期,从 29/07/2021 到 05/08/2021。我想运行一个 SQLite3 查询,它只返回这 8 个日期中的最新 7 个(即 30/07/2021 到 05/08/2021),但它返回每个日期的所有行。

我尝试过像这样使用 LIMIT 关键字:

all_app_data = sorted(conn.execute('SELECT date, application, usage_time FROM monitor '
                                   'ORDER BY date DESC, usage_time ASC LIMIT 7').fetchall()) 

但是,这只从每个日期提取 1 行(即从 2021 年 7 月 30 日开始的 1 行,而不是现有的 5 行)。我怎样才能解决这个问题?

4

2 回答 2

0

您可以通过在子查询中收集符合条件的日期来做到这一点:

SELECT m1.date, m1.application, m1.usage_time 
FROM monitor m1 
WHERE m1.date IN
  (SELECT DISTINCT m2.date 
   FROM monitor m2
   ORDER BY m2.date DESC LIMIT 7)
ORDER BY m1.date DESC, m1.usage_time ASC

(您也可以加入反对子查询)

于 2021-07-30T13:27:44.810 回答
0

您可以使用DENSE_RANK()窗口功能来做到这一点:

SELECT date, application, usage_time 
FROM (
  SELECT *, DENSE_RANK() OVER (ORDER BY date DESC) rn
  FROM monitor
) 
WHERE rn <= 7
ORDER BY date DESC, usage_time ASC 
于 2021-07-30T13:34:32.350 回答