我正在尝试编写一个SQL命令,该命令将重新创建某个日期的报告数据。该表有三列(location(varchar)、value(int)和datetime(datetime))。随着时间的推移,行会添加到表中,为每个位置提供更新的值。
我应该使用什么SQL来:对于每个位置,只返回给定日期时间之前具有最近日期时间的行。
示例:
Location Value Datetime
A 5 2011-01-01
B 6 2011-01-01
A 7 2012-01-01
A 8 2012-06-01
如果我对2012-05-01感到好奇,我想回到第2排和第3排。
我想的是GROUP BY位置,并指定保留小于给定日期时间的最大日期时间。我假设SQL中有一些内置的日期时间对象功能,我应该使用这些功能。
直接的方法:获取每个位置的最大日期,然后选择完整的记录:
select *
from mytable
where (location, datetime) in
(
select location, max(datetime)
from mytable
where datetime < date '2012-05-01'
group by location
);
在MySQL 8.x中,您可以使用ROW_NUMBER()
窗口函数。例如:
with x as (
select
location, value, datetime,
row_number() over (partition by location order by datetime desc) as rn
from my_table
where datetime < '2012-05-01' -- cutoff date
)
select * from x where rn = 1