我有SQL的基本知识,并有一个问题:
我正在尝试从时间序列(日期和风速)中选择数据。如果它位于7到21小时之间,我想选择原始风速值。如果小时超出此范围,我想在第21小时将风速分配给之前的风速。还有一个问题是小时21不存在的偶然点,并希望将风速分配为小时20 ... 19等,直到找到下一个可用小时。
SELECT
date,
CASE WHEN DATEPART(HH,date) < 7 OR DATEPART(HH,date) > 21
THEN '<WIND SPEED AT HOUR 21> ELSE <WIND SPEED> END AS ModifiedWindspeed
,WindSpeed, winddirection
from TerrainCorrectedHourlyWind w
这可能会让事情更加清晰。如果小时在指定范围内,请选择windspeed。如果没有,那么选择前一天21小时的风速。
答案 0 :(得分:0)
虽然你已经标记了问题mysql,但我猜这实际上是SQL Server,因为使用了DATEPART()
函数。请尝试以下操作:使用OUTER APPLY
获取备用值:
SELECT Date
, CASE
WHEN DATEPART(HOUR, Date)BETWEEN 7 AND 21 THEN w.WindSpeed
ELSE m.WindSpeed
END AS ModifiedWindSpeed
, w.WindSpeed
, w.WindDirection
FROM TerrainCorrectedHourlyWind AS w
OUTER APPLY(SELECT TOP 1 WindSpeed
FROM TerrainCorrectedHourlyWind
WHERE DATEPART(HOUR, Date)BETWEEN 7 AND 21
AND Date < w.Date
ORDER BY Date DESC)AS m;
只是为了解释这是做什么的,OUTER APPLY
将获得有关记录之前的日期的最新记录(TOP 1
和ORDER BY Date DESC
){{1 }}以及在指定的时间内。顶部附近的Date < w.Date
选择是使用当前值还是基于小时的备用值。