SELECT集最近的id,金额FROM表,其中id多次出现

时间:2010-04-12 21:26:33

标签: sql mysql

我有一个表格,记录给定服务在给定日期传输的数据量。每天为特定服务输入一条记录。

我希望能够为一组服务检索最新的amount

示例数据集:

serviceId | amount | date
-------------------------------
1         | 8      | 2010-04-12   
2         | 11     | 2010-04-12  
2         | 14     | 2010-04-11  
3         | 9      | 2010-04-11  
1         | 6      | 2010-04-10  
2         | 5      | 2010-04-10  
3         | 22     | 2010-04-10  
4         | 17     | 2010-04-19

期望的响应(服务ID 1,2,3):

serviceId | amount | date
-------------------------------
1         | 8      | 2010-04-12   
2         | 11     | 2010-04-12  
3         | 9      | 2010-04-11 

期望的响应(服务ID 2,4):

serviceId | amount | date
-------------------------------
2         | 11     | 2010-04-12  
4         | 17     | 2010-04-19

这将检索等效项,即每个serviceId运行以下一次:

SELECT serviceId, amount, date
FROM table
WHERE serviceId = <given serviceId>
ORDER BY date DESC
LIMIT 0,1

我理解如何在X查询中检索我想要的数据。我很想知道如何使用单个查询或至少少于X个查询来检索相同的数据。

我很想知道什么是最有效的方法。该表目前包含28809条记录。

我理解还有其他问题涉及选择最新的记录集。我已经检查了三个这样的问题但是无法将解决方案应用到我的问题中。

2 个答案:

答案 0 :(得分:3)

select m.*
from (
    select serviceId, max(date) as MaxDate
    from MyTable
    group by serviceId
) mm
inner join MyTable m on mm.serviceId = m.serviceId and mm.MaxDate = m.date

如果您希望按serviceId过滤,可以执行以下操作:

select m.*
from (
    select serviceId, max(date) as MaxDate
    from MyTable
    where serviceId in (1, 2, 3)
    group by serviceId
) mm
inner join MyTable m on mm.serviceId = m.serviceId and mm.MaxDate = m.date

答案 1 :(得分:0)

SELECT serviceId, amount, date 
  FROM table as t
  WHERE NOT EXIST (
    SELECT * FROM table as x 
       WHERE t.serviceId = x.serviceID AND t.date < x.date
  )

如果你想过滤掉一些比

更多的serviceIds
SELECT serviceId, amount, date 
  FROM table as t
  WHERE NOT EXIST (
    SELECT * FROM table as x 
       WHERE t.serviceId = x.serviceID AND t.date < x.date
  ) 
  AND serviceId in (2, 4)