基于其他列的列的最大值(值)-SQL

时间:2018-09-05 08:47:56

标签: sql-server group-by max

我看到了一些类似的问题,但我无法使用它来完成查询:

我有很多每小时的预报数据,并且每小时都会有新的预报,并且它们都从现在开始到未来几天进行预报。我的目标是创建一个查询(用于视图中),该查询为我提供每天(日期和小时)的最新预测的预测数据。

FDate =预测日期

小时=预测小时

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年9月10日,即预测的最后一天,它不会给我2018年9月6日,依此类推。

我的查询结果:

FDate       FHour   Value   RDate       RHour
2018-09-02  10      99      2018-09-02  9
2018-09-02  10      82      2018-09-02  8

我的目标还是只返回第一行。

2 个答案:

答案 0 :(得分:2)

执行此操作的方法是使用row_number函数,因为它可以让您根据需要进行排序。

例如,如果您想要给定FDate的最后一行,则可以执行以下操作:

;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),并可以根据您的需要进行排序。一切由您决定。

答案 1 :(得分:0)

按日期和小时获取最新记录,在两列中使用ORDER BY并对降序(DESC)进行排序。

仅获取第一行,使用TOP(1)

SELECT TOP(1) *
FROM MyTable
ORDER BY RDate DESC, RHour DESC
相关问题