我见过一些类似的问题,我还没能用它完成我的查询:
我有大量的每小时预测数据,每小时都有新的预测,他们都预测从现在到未来几天。我的目标是创建一个查询(在视图中使用),从日常(日期和小时)的最新预测中获取预测数据。
日期=预测日期
FHour =预测时间
RDate =进行日期预测
RHour =进行小时预测
我的桌子:
FDate FHour Value RDate RHour
2018-09-02 10 99 2018-09-02 9
2018-09-02 10 82 2018-09-02 8
2018-09-02 10 86 2018-09-01 20
在这个例子中,我只想要第一行,因为这是最新的预测。
我想出了一个查询,它给出了预测的最新日期的预测数据,但不是最新的小时。
SELECT t.FDate, t.FHour, t.Value, t.RDate, t.RHour
FROM MyTable t
INNER JOIN (
SELECT FDate, MAX(RDate) As MaxDate
FROM Mytable
GROUP BY FDate) tm t.FDate = tm.FDate AND t.RDate = tm.MaxDate
我试图在查询中包含MAX(RHour),但它只给出了比今天更早的日期和预测中的最新日期,而不是之间的一次。例如:从昨天和早些时候再到2018-09-10,这是预测的最后一天,它不会给我2018-09-06等等。
我查询的结果:
FDate FHour Value RDate RHour
2018-09-02 10 99 2018-09-02 9
2018-09-02 10 82 2018-09-02 8
我的目标再次只是返回第一行。
执行此操作的方法是使用row_number函数,因为它可以让您根据需要进行排序。
例如,如果您想要给定日期的最后一行,您可以执行以下操作:
;with t as (
select *, row_number() over (partition by FDate, fHour
order by RDate desc, RHour desc) r
from myTable
)
select * from t where r=1
您可以看到,这可以根据您的需要进行分区(在本例中我猜的是FDate和FHour),并按您想要的顺序排序。听你的。
按日期和小时获取最新记录,在两列上使用ORDER BY
并按降序排序(DESC
)。
只获取第一行,使用TOP(1)
。
SELECT TOP(1) * FROM MyTable ORDER BY RDate DESC, RHour DESC