【问题标题】:How do I select last entry for today + last 6 days data如何选择今天的最后一个条目 + 过去 6 天的数据
【发布时间】:2019-09-25 05:37:51
【问题描述】:

如何选择今天最近的最后一个条目 + 一天结束的最近 6 天数据,每天一次

同一天有很多行,时间不同。

应该只选择7行数据。

+----+-----------------------+
| C1 |   C2                  |
+----+-----------------------+
|  1 |   2019-09-19 00:01:02 |
|  2 |   2019-09-19 00:05:02 |
|  3 |   2019-09-19 23:59:02 |
|  4 |   2019-09-20 00:15:02 |
|  5 |   2019-09-21 00:15:02 |
|  6 |   2019-09-22 00:15:02 |
|  7 |   2019-09-23 00:15:02 |
|  8 |   2019-09-24 00:15:02 |
|  9 |   2019-09-25 00:10:02 |
| 10 |   2019-09-25 00:12:02 |
+----+-----------------------+

【问题讨论】:

标签: mysql sql


【解决方案1】:

此查询将为您提供所需的结果。它每天在子查询中查找前 7 个最大 C2 值,然后将其连接到原始表以获取当天的值:

SELECT d1.*
FROM data d1
JOIN (SELECT DATE(C2) AS Day, MAX(C2) AS C2
      FROM data
      GROUP BY Day
      ORDER BY Day DESC
      LIMIT 7) d2 ON d2.C2 = d1.C2
ORDER BY Date(d1.C2)

输出(为了证明只得到 7 个结果,样本稍微大一点)

C1  C2
3   2019-09-19 23:59:02
4   2019-09-20 00:15:02
5   2019-09-21 00:15:02
6   2019-09-22 00:15:02
7   2019-09-23 00:15:02
8   2019-09-24 00:15:02
10  2019-09-25 00:12:02

Demo on dbfiddle

【讨论】:

  • 我似乎永远无法跟踪LIMIT 是否可以这样使用,我想它可以是+1。不过,您可能希望坚持使用 OP 的原始数据。
  • @TimBiegeleisen 谢谢 - OPs 原始数据的问题是它只有 7 天,所以它不会证明查询正确地选择了最近和前 6 天。
  • @Strawberry 是的,它会......我应该从一开始就这样做。现在已经这样做了。
  • 谢谢@尼克!!以及大家的帮助!
  • @Jimmy 不用担心。我很高兴能帮上忙。
【解决方案2】:

如果您使用的是 MySQL 8+,我们可以使用 ROW_NUMBER 处理此问题:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY DATE(C2) ORDER BY C2 DESC) rn
    FROM yourTable
    WHERE C2 >= CURDATE() - INTERVAL 6 DAY
)

SELECT C1, C2
FROM cte
WHERE rn = 1;

Demo

【讨论】:

  • @Nick 不...我想我应该减去 6 天。第 7 天减 6 天落在第 1 天,但总共包含 7 天。
【解决方案3】:

我会使用 GROUP BY 来选择每一天,所以:

SELECT *
FROM data
WHERE C2 IN (
     SELECT max(C2)
     FROM data
     WHERE C2 > curdate() - interval 3 day
     GROUP BY date(C2)
     )
ORDER BY C2

我总是喜欢在查询条件(如“WHERE C2”)中使用列的“原始”值,因为这很容易让数据库在它决定需要的地方使用索引。

小提琴: https://www.db-fiddle.com/f/Bh2EU5bcQvmJfyCZqExmS/1

【讨论】:

    【解决方案4】:

    一种方法是:

    select t.*
    from t
    where t.c2 = (select min(t2.c2)
                  from t t2
                  where t2.c2 >= date(t.c1) and
                        t2.c2 < date(t.c1) + interval 1 day
                 )
    order by date desc
    limit 7
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多