SQL查询返回查询中最高日期值

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

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

它会从下面显示的schedule表中返回1、2、3、4、5记录

schedule表

+----+------------+-------------+-----------------+------------+----------+
| id | eventdate  | resource_id |      text       |  added_on  | added_by |
+----+------------+-------------+-----------------+------------+----------+
|  1 | 2014-09-05 |           1 | Some old text   | 2014-08-01 | Sam      |
|  2 | 2014-09-05 |           1 | Some newer text | 2014-09-01 | Jordan   |
|  3 | 2014-09-06 |           1 | another day     | 2014-09-03 | Jordan   |
|  4 | 2014-09-05 |           1 | Most recent     | 2014-09-10 | Jordan   |
|  5 | 2014-09-07 |           2 | Other resource  | 2014-09-09 | Sam      |
+----+------------+-------------+-----------------+------------+----------+

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

在上面的示例中,我希望仅返回3、4、5记录。记录1和2已被记录4替代。

请注意:added_on列的类型为日期时间戳(yyyy-mm-dd HH:mm:ss),已经被省略以清晰明了。

我不知道查询将返回多少行,确定记录唯一性的信息是eventdate、resource_id和added_on,即每个资源每天只应返回一条记录,并且该记录应具有最高的added_on值。


1
什么决定了第1行、第2行被第3行取代? - John Ruddell
是否有一列始终保持不变的(EventID)? - Edi G.
为什么返回 ID 为3?它也应该被取代了,对吧? - Strawberry
4个回答

2
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 

它将为您工作


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 | 
+----+------------+------------+

1
仅供参考,MySQL中不存在LAST。 - John Ruddell
此时,您基本上是在伪造一行。如果 OP 需要的不仅仅是 id、eventdate 和 added_on,那么这些行将无法匹配。 - John Ruddell
是的,你说得对。我只是根据Jordan想要的输出来回答问题。如果他需要更多的字段,他应该像你下面的答案一样使用一个select中的select。然而,一个带有select中的select的查询运行得太慢了。所以为什么你不需要它时还要使用运行缓慢的查询呢?只有在必要时才使用它。 - slek

1

注意:

您说您通过三个列eventdate、resource_id和added_on来确定每天的唯一性,但你只想得到每天最大的added_on...所以不要按added_on分组...按eventdate分组以按日获取数据,按eventdate、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

如果您想使用最高的added_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

的英译中,保留了 HTML 标签,不做解释。

1
您需要获取每个事件日期、资源ID、添加时间的最新记录,如下所示:
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'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接