我需要做一个MySQL连接,它结合了每天的温度测量和当天的最高温度。
我有两个表:温度(包含测量值)和max_temperatures(包含一段时间内的最高温度)。
table temperatures
================
id (int)
temperature (decimal)
measure_date (date)
table thresholds
================
id (int)
max_temperature (decimal)
startdate (date)
说,我在表阈值中有两条记录:
1 | 15 | 2014-12-31
2 | 14 | 2015-01-04
有没有办法获得这样的记录集?
measure_date | temperature | max_temperature
--------------------------------------------
2015-01-01 | 12 | 15
2015-01-02 | 11 | 15
2015-01-03 | 12 | 15
2015-01-04 | 14 | 14
2015-01-05 | 16 | 14
2015-01-06 | 13 | 14
不幸的是,阈值表不能保留enddates,或者我可以在temperature.measure_date介于thresholds.startdate和thresholds.enddate之间进行连接。
答案 0 :(得分:3)
由于您没有结束日期,因此您必须使用子查询找到自己的最大结束值...以下是我如何解决它:
select b.measure_date, b.temperature, a.max_temperature
from thresholds a
inner join temperatures b on b.measure_date >= a.startdate
where a.startdate = (select max(startdate)
from thresholds a2
where a2.startdate <= b.measure_date);
基本上我在这里做的是:
答案 1 :(得分:0)
这种方法与其他方法略有不同,但结果应该相同,所以我仍然发布,主要是因为这是你自己解释的最接近的方式。
您可以通过这种方式获得您希望在问题中拥有的startdate-enddate:
SELECT *, (SELECT MIN(startdate)
FROM thresholds t1
WHERE t1.startdate>t.startdate) AS enddate
FROM thresholds t
id max_temperature startdate enddate
1 15 2014-12-31 2015-01-04
2 14 2015-01-04 NULL
一旦你有了它,就可以像你写的一样加入温度:
SELECT measure_date, temperature, max_temperature
FROM temperatures temps
LEFT JOIN (SELECT *, (SELECT MIN(startdate)
FROM thresholds t1
WHERE t1.startdate>t.startdate) AS enddate
FROM thresholds t) tt
ON temps.measure_date >= tt.startdate
AND (temps.measure_date<enddate OR enddate IS NULL);