这是我在更大的SQL脚本中的子查询。它在多个不同的CASE语句中执行相同的操作,所以我希望我可以以某种方式组合操作,因此它不必一遍又一遍地做同样的事情。但是,如果我在CASE语句之外移动ORDER BY命令,则无法获得正确的结果。
我正在JDAY上加入2个表,met_data和flexgridlayers_table。 Flexgridlayers_table具有JDAY和Segment的字段,met_data具有JDAY,TAIR和TDEW字段(在这个简单的示例中,实际上是更多的字段)。我通过Matlab运行它,因此 variable1 和 variable2 是由嵌套循环设置的值。我需要使用CASE语句来解释 variable1 不等于1的情况,然后我想输出0.否则,我想找到与JDAY连接相对应的值,但值可能不是F.JDAY和M.JDAY的完全匹配。我想匹配最接近的< =值,因此我在每个子查询中使用ORDER BY M.JDAY DESC LIMIT 1语句。
输出是一个包含字段JDAY(来自F.JDAY),TAIR和TDEW的表。每当我尝试移动CASE语句之外的ORDER BY部分来摆脱重复的子查询时,我只得到一行代表最大JDAY的结果。这个查询给了我正确的结果 - 有没有办法优化它?
SELECT F.JDAY,
CASE
WHEN *variable1*<>1 THEN 0
ELSE
(SELECT M.TAIR
FROM met_data AS M
WHERE M.Year=2000 AND M.JDAY<=F.JDAY
ORDER BY M.JDAY DESC LIMIT 1)
END AS TAIR,
CASE
WHEN *variable1*<>1 THEN 0
ELSE
(SELECT M.TDEW
FROM met_data AS M
WHERE M.Year=2000 AND M.JDAY<=F.JDAY
ORDER BY M.JDAY DESC LIMIT 1)
END AS TDEW
FROM FlexGridLayers_table AS F
WHERE F.SEGMENT=*variable2*
进一步解释:
此查询从flexgridlayers_table中提取所有JDAY值,然后在表met_data中搜索,以查找与该表中最接近的&lt; = JDAY值对应的值。例如,请考虑以下flexgridlayers_table和met_data表:
flexgridlayers_table:
Segment JDAY
2 1.5
2 2.5
2 3.5
3 1.5
3 2.5
3 3.5
met_data:
JDAY Year TAIR TDEW
1.0 2000 7 8
1.1 2000 9 10
1.6 2000 11 12
2.5 2000 13 14
2.6 2000 15 16
3.4 2000 17 18
4.0 2000 19 20
对于 variable1 = 1和 variable2 = 2,我想要的(以及上面的查询返回的内容)是这样的:
JDAY TAIR TDEW
1.5 9 10
2.5 13 14
3.5 17 18
我只是想知道是否有更有效的方法来编写此查询,因此我不会在每个TAIR,TDEW等字段上反复对JDAY值的相同列表执行ORDER BY命令。
答案 0 :(得分:2)
然后我会写如下......看起来你正在为每个JDAY寻找一个“TAIR”和“TDEW”。如果是这种情况,请在年份条件和F vs M JDay值上对您的met_data表应用LEFT JOIN。现在通常,这将为每个“JDay”返回多行
SELECT
PQ.JDay,
PQ.MaxJDayPerFDay,
CASE WHEN *var1* <> 1 THEN 0 ELSE M2.TAIR END TAIR,
CASE WEHN *var1* <> 1 THEN 0 ELSE M2.TDEW END TDEW
from
( SELECT
F.JDay,
MAX( M.JDAY ) as MaxJDayPerFDay
from
FlexGridLayers_Table F
JOIN met_Data M
ON M.Year = 2000
AND F.JDay >= M.JDay
where
F.Segment = *var2*
group by
F.JDay ) PQ
JOIN Met_Data M2
on M2.Year = 2000
AND PQ.MaxJDayPerFDay = M2.JDay
现在,这通过JDay在met_data ONCE和group中应用MAX()JDay进行预查询,因此它将始终为每个F.JDay返回一条记录。所以,现在你有一个预先限定你的F.Segment =变量2的查询。如果你想从“F”表中得到其他列,请根据需要将它们放入这个“PreQuery”(PQ别名)。
然后,此结果可以立即连接回met_data表,因为现在可以从预查询中明确知道一天的值。因此,您现在可以同时获取TAIR和TDEW值,而不是在每个记录中应用两个单独的查询。
希望这有意义,如果没有,请告诉我。