【问题标题】:Select Last N days data based on datetime column根据日期时间列选择最近 N 天数据
【发布时间】:2021-04-13 19:31:34
【问题描述】:

我有 datetime 列,它的值如下所示

2021-04-13 15:31:59
2021-04-13 15:29:59
2021-04-12 15:31:59
2021-04-12 15:29:59
2021-04-10 15:31:59
2021-04-10 15:29:59
2021-04-8 15:31:59
2021-04-8 15:29:59

我想选择表格中最近 3 天的可用数据

在上面的例子中是 2021-04-10 , 2021-04-12 和 2021-04-13

我尝试了类似下面的方法

SELECT * FROM `table` WHERE DATE(`timer`) >= DATE(NOW()) - INTERVAL 3 DAY 

但是它从 2021-04-12 返回数据,因为没有 2021-04-11 的可用数据。

【问题讨论】:

标签: mysql sql mariadb


【解决方案1】:

在 MariaDB 10.2.32 中您可以使用DENSE_RANK() 窗口函数:

SELECT *
FROM (
  SELECT *, DENSE_RANK() OVER (ORDER BY DATE(timer) DESC) rnk
  FROM tablename
) t
WHERE rnk <= 3

查看简化的demo

【讨论】:

  • 谢谢我收到警告 - 当前选择不包含唯一列,查询速度也从 0.003 降低到 0.03..
  • @Graciewilliams 警告(是 phpMyAdmin 吗?)是关于您的数据,而不是关于查询。关于速度,为什么说它降低了?与什么相比?
  • 是的 phpmyadmin ,对于正常的 SELECT * FROM price ORDER BY timer DESC 和有关时间,我没有收到该错误如果您在我的问题中看到查询,它只需要 0.003 秒。但这需要 0.03 秒.. 可以吗?
  • @Graciewilliams 您问题中的查询会扫描表一次并过滤掉不满足条件的行。但这不是您问题的解决方案,因为它忽略了不存在的日期。这就是我使用窗口函数的原因。我的查询根据日期扫描表一次以将排名编号分配给行,然后再次扫描结果以过滤掉行。
  • 好的,谢谢,有没有办法只对过去 3 天进行排序?并运行查询大于最后一天? ,, 我认为它有可能在 DATE 列中获得 unqiue 列,但是在 DATETIME 中有没有办法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 2018-08-20
  • 2021-02-02
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
相关资源
最近更新 更多