【问题标题】:SQL Query return highest date value in querySQL 查询返回查询中的最高日期值
【发布时间】:2014-11-03 16:16:36
【问题描述】:

我正在尝试运行查询以执行以下操作:
返回给定日期范围内表中的所有最新条目。
目前我正在使用这个查询

SELECT id FROM schedule WHERE eventdate BETWEEN '2014-09-01' AND '2014-09-07'

从下面显示的计划表中返回记录 1,2,3,4,5

时间表。

+----+------------+-------------+------ +------------+----------+ |编号 |活动日期 |资源 ID |正文 |已添加 |添加人 | +----+------------+-------------+------ +------------+----------+ | 1 | 2014-09-05 | 1 |一些旧文| 2014-08-01 |山姆 | | 2 | 2014-09-05 | 1 |一些较新的文字 | 2014-09-01 |约旦 | | 3 | 2014-09-06 | 1 |改天| 2014-09-03 |约旦 | | 4 | 2014-09-05 | 1 |最近 | 2014-09-10 |约旦 | | 5 | 2014-09-07 | 2 |其他资源 | 2014-09-09 |山姆 | +----+------------+-------------+------ +------------+----------+

我试图只返回指定日期范围内的唯一记录,其中应该返回的唯一记录是那些在added_on 列中具有最高日期时间戳的记录。

在上面的示例中,我只想返回记录 3、4、5。记录 1 和 2 已被记录 4 取代。

**请注意:added_on 列的类型为日期时间戳 (yyyy-mm-dd HH:mm:ss),为清楚起见已省略**

不知道查询会返回多少行,决定记录唯一性的信息是eventdate, resource_id and added_on
即每个资源每天应该只返回一条记录,并且这条记录应该具有最高的附加值

【问题讨论】:

  • 什么决定第 1,2 行被第 3 行取代?
  • 有一列始终保持不变(EventID)?
  • 为什么返回 id 3?它也应该被取代,对吧?

标签: mysql sql greatest-n-per-group


【解决方案1】:

我认为这将是您可以进行的最简单的查询。如果您还有其他问题,请在此处发表评论。

 SELECT MAX(id) , eventdate, Max(added_on) FROM schedule GROUP BY eventdate.

这将返回

+----+------------+------------+
| id | eventdate  |  added_on  | 
+----+------------+------------+
|  3 | 2014-09-06 | 2014-09-03 | 
|  4 | 2014-09-05 | 2014-09-10 | 
|  5 | 2014-09-07 | 2014-09-09 | 
+----+------------+------------+

【讨论】:

  • LAST 在 MySQL 中并不存在,仅供参考
  • 此时你基本上是在假装一行。如果 OP 想要的不仅仅是 id eventdate 和 added_on 怎么办?行不匹配。
  • 是的,你是对的。我只是根据乔丹想要的输出来回答。好吧,如果他需要比这更多的字段,他应该在选择中使用选择,就像您在下面的答案一样。但是,在 select 中使用 select 的查询运行速度太慢。那么,如果不需要,为什么要使用运行缓慢的查询呢?必要时使用它。
【解决方案2】:

注意:

您说您通过 eventdate、resource_id 和 added_on 三列来确定每一天的唯一性...但您只想要每天最大的 added_on...所以不要按 added_on 分组。按 eventdate 分组以获得按天数据,按事件日期分组,resource_id 以获取每个 resource_id 的天数据。

尝试获取唯一 ID,然后通过它们过滤外部查询

SELECT * 
FROM schedule
WHERE ID IN
(   SELECT MAX(id) 
    FROM schedule 
    WHERE eventdate BETWEEN '2014-09-01' AND '2014-09-07' 
    GROUP BY eventdate, resource_id
)

DEMO1

或者如果你想使用最高add_on,你可以这样做

SELECT * 
FROM schedule
WHERE added_on IN
(   SELECT MAX(added_on) 
    FROM schedule 
    WHERE eventdate BETWEEN '2014-09-01' AND '2014-09-07' 
    GROUP BY eventdate, resource_id
)

DEMO2

如果您想摆脱使用 IN 并使用 JOIN,您可以在 MAX() 上添加 JOIN。

SELECT * 
FROM schedule s
JOIN 
(   SELECT MAX(added_on) as added_on 
    FROM schedule
    WHERE eventdate BETWEEN '2014-09-01' AND '2014-09-07' 
    GROUP BY eventdate, resource_id
) t ON t.added_on = s.added_on

DEMO3

【讨论】:

    【解决方案3】:
    SELECT s1.* FROM schedule s1  
    inner join (select max(id) as id1 from schedule WHERE eventdate BETWEEN '2014-09-01' AND '2014-09-07' group by eventdate,resource_id ) as s2 on s2.id1=s1.id 
    

    它会为你工作

    【讨论】:

      【解决方案4】:

      您需要获取 eventdate、resource_id、added_on 的每个唯一组合的最新记录,如下所示:

      SELECT schedule.* 
      FROM schedule JOIN (
         SELECT MAX(id) AS max_id 
         FROM schedule
         GROUP BY eventdate, resource_id, added_on
      ) t
      ON t.max_id = schedule.id
      WHERE eventdate BETWEEN '2014-09-01' AND '2014-09-07'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-25
        • 1970-01-01
        • 2020-07-04
        • 1970-01-01
        • 2014-05-23
        • 1970-01-01
        • 2021-05-21
        • 2021-09-08
        相关资源
        最近更新 更多