2015-01-16 2 views
2

Мне нужно сделать соединение MySQL, которое объединяет измерения температуры в день и максимальную температуру за этот день.MySQL join условно между датами

  • Новые измерения температуры хранятся каждый день.
  • Максимальная температура сохраняется за период, используя стартовую дату за этот период.

У меня есть две таблицы: температуры (содержащие измерения) и 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, или я мог бы сделать присоединиться где temperatures.measure_date между thresholds.startdate и thresholds.enddate.

ответ

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 больше или равно стартовой.
  • Убедитесь, что начальная дата максимально возможная, поскольку у нас нет даты окончания.
+2

darn! не был достаточно быстрым – jmadsen

+1

Это решило. Большой! – webmonger

+0

@webmonger Если это ответили на ваш вопрос, пожалуйста, рассмотрите вопрос о ответе, как принято. –

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); 
Смежные вопросы