MySQL在日期之间加入条件

时间:2015-01-16 23:23:34

标签: mysql join

我需要做一个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之间进行连接。

2 个答案:

答案 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);

基本上我在这里做的是:

  • 加入两个表,条件是measure_date高于或等于startdate。
  • 请确保开始日期最晚,因为我们没有结束日期。

答案 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);