【问题标题】:Limiting number of unique dates selected in SQLite3 SELECT Query限制 SQLite3 SELECT 查询中选择的唯一日期的数量
【发布时间】:2021-10-06 00:38:51
【问题描述】:

所以基本上,这是我拥有的一个 SQLite3 表: Click Here for Image

如图所示,有 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 行)。我该如何解决这个问题?

【问题讨论】:

  • 创建一个查询,查找七个最新日期中最旧的日期,并将其用作“where”子句中的子查询,以便过滤掉较旧的日期。

标签: python python-3.x sqlite python-sql


【解决方案1】:

你可以用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 

【讨论】:

  • 成功了!谢谢!你介意解释一下这段代码到底发生了什么吗,因为我不知道 DENSE_RANK() 函数、OVER 方法和关键字 'rn' 的作用。
  • @Angad_K DENSE_RANK() 是一个窗口函数,它返回一个数字,该数字是基于 OVER () 中的 ORDER BY 子句的每一行的排名。你可以在这里找到更多信息:sqlitetutorial.net/sqlite-window-functions/sqlite-dense_rank
  • 感谢您的信息和描述!
【解决方案2】:

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

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

(您也可以加入子查询)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多