这是我在较大 SQL 脚本中的子查询。它在多个不同的 CASE 语句中执行相同的操作,所以我希望我可以以某种方式组合该操作,这样它就不必一遍又一遍地做同样的事情。但是,如果我将 ORDER BY 命令移到 CASE 语句之外,我将无法获得正确的结果。
我在 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 的表。每当我尝试将 ORDER BY 部分移到 CASE 语句之外以摆脱重复的子查询时,我只会得到代表最大 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 中搜索以查找与该表中最接近的 <= 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 命令。