2

假设您有下表(这里感兴趣的列是 binid):

id  datetime                 agid   binid   status
 1  2013-02-01 11:03:49        0      25    1
 2  2013-02-01 11:03:53        0      25    1
 3  2013-02-01 11:04:21        0      26    1
 4  2013-02-01 11:04:23        0      26    0
 5  2013-03-01 11:04:26        0      25    0
 6  2013-03-01 11:04:30        0      36    0
 7  2013-03-01 11:04:34        0      36    1
 8  2013-03-01 11:04:35        0      36    1
 9  2013-03-01 11:04:36        0      36    1
 10 2013-03-01 11:04:39        0      36    0
 11 2013-03-01 11:04:41        0      36    1
 13 2013-03-01 11:04:50        0      25    1
 14 2013-03-01 11:04:53        0      26    1
 15 2013-03-01 11:15:25        0      25    1
 16 2013-03-01 11:15:30        0      25    0
 17 2013-03-01 11:15:39        0      23    1
 18 2013-03-01 11:15:43        0      26    1

如何提取在特定时间范围内发生的每个 binid 的最后一次出现?

这是我目前使用的:

SELECT * FROM ( reports ORDER BY datetime ASC ) 
WHERE datetime >= TIMESTAMP('2013-03-01') 
GROUP BY binid

但它会返回第一次出现。如何返回每个唯一 binid 的最后一次出现?

4

4 回答 4

8

您应该使用子查询来获取结果:

select r1.*
from reports r1
inner join
(
  select max(datetime) MaxDate, binid
  from reports
  WHERE datetime >= TIMESTAMP('2013-03-01') 
  group by binid
) r2
  on r1.binid = r2.binid
  and r1.datetime = r2.maxdate
WHERE r1.datetime >= TIMESTAMP('2013-03-01') 

请参阅带有演示的 SQL Fiddle

问题是,当您GROUP BY在单个列上使用 a 时,MySQL 可能会为不在GROUP BY. (参见MySQL 对 GROUP BY 的扩展)。

来自 MySQL 文档:

MySQL 扩展了 GROUP BY 的使用,以便选择列表可以引用未在 GROUP BY 子句中命名的非聚合列。...您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,这主要在每个未在 GROUP BY 中命名的非聚合列中的所有值对于每个组都相同时很有用。服务器可以从每个组中自由选择任何值,因此除非它们相同,否则选择的值是不确定的。此外,从每个组中选择值不会受到添加 ORDER BY 子句的影响。在选择了值之后对结果集进行排序,并且 ORDER BY 不会影响服务器选择的值。

于 2013-03-01T19:40:53.267 回答
3
SELECT binid, 
       SUBSTRING_INDEX(GROUP_CONCAT(agid ORDER BY datetime DESC), ',', 1) AS agid, 
       SUBSTRING_INDEX(GROUP_CONCAT(status ORDER BY datetime DESC), ',', 1) AS status
FROM reports
WHERE datetime <= TIMESTAMP('2013-03-01')
GROUP BY binid;
于 2013-03-01T19:45:54.617 回答
0
SELECT * FROM ( reports ORDER BY datetime DESC) 
WHERE datetime >= TIMESTAMP('2013-03-01') 
GROUP BY binid LIMIT 1
于 2013-03-01T19:41:00.583 回答
-3

更改ORDER BY ASCORDER BY DESC。应该做的伎俩。

于 2013-03-01T19:39:47.840 回答