Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从表中选择一组最近的id,amount FROM table,其中id多次出现_Sql_Mysql - Fatal编程技术网

Sql 从表中选择一组最近的id,amount FROM table,其中id多次出现

Sql 从表中选择一组最近的id,amount FROM table,其中id多次出现,sql,mysql,Sql,Mysql,我有一个表,记录了给定服务在给定日期传输的数据量。对于给定的服务,每天输入一条记录 我希望能够检索一组服务的最新金额 示例数据集: serviceId | amount | date ------------------------------- 1 | 8 | 2010-04-12 2 | 11 | 2010-04-12 2 | 14 | 2010-04-11 3 | 9 | 20

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

我希望能够检索一组服务的最新金额

示例数据集:

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条记录

我很感激还有其他问题涉及选择最新的一组记录。我已经研究了三个这样的问题,但无法将解决方案应用于我的问题

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
如果要筛选出某些ServiceID,请

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