每月返回一条记录

时间:2017-05-16 21:36:58

标签: sql sql-server

我还没想出如何按日期分组以获得每月1条记录这是我的疑问:

select Date, weight 
  from Usrs 
 where usr = b 
 order by month

返回:

user b
date        weight
15/03/2017  18
15/03/2017  14
19/02/2017  19
18/03/2017  9
22/04/2017  24
30/04/2017  33
01/05/2017  15
03/05/2017  30

但我只需要每个月的最后一条记录,所以我想要的就像这样

date        weight
15/03/2017  18
19/02/2017  19
18/03/2017  9
30/04/2017  33
03/05/2017  30

任何想法我怎样才能达到目标?

1 个答案:

答案 0 :(得分:1)

使用ROW_NUMBER对每月的记录进行编号,并保留最后的日期。

select date, weight
from
(
  select 
    date, weight, 
    row_number() over (partition by year(date), month(date) order by date desc) as rn
  from Usrs 
  where usr = 'b'
) numbered
where rn = 1
order by date;

这是标准SQL,适用于SQL Server。但是,它在MySQL中不起作用,因为MySQL没有像ROW_NUMBER这样的窗函数。您可以使用变量在MySQL中模拟ROW_NUMBER。查一查;你会在SO上找到很多答案。

另一种选择是选择每月的最大日期,然后选择相应的记录:

select date, weight
from usrs
where usr = 'b'
and date in
(
  select max(date)
  from usrs
  where usr = 'b'
  group by year(date), month(date)
);

这又是标准SQL,适用于SQL Server和MySQL。这里必须读取两次表,因此ROW_NUMBER方法通常是首选方法。