2016-06-07 7 views
0

У меня есть данные, как,SQL совместить значение 2 столбца для строк

ID SensorID        Reading_Time      Value  Type 
11 A3C3EB0B-1F5E-3737-B5F7-495BFA238F88 2016-06-02 14:38:16.4980000 -04:00 24.782219 0 
12 A3C3EB0B-1F5E-3737-B5F7-495BFA238F88 2016-06-02 14:38:16.4980000 -04:00 23.121845 1 
13 A3C3EB0B-1F5E-3737-B5F7-495BFA238F88 2016-06-02 14:38:46.5780000 -04:00 24.77972 0 
14 A3C3EB0B-1F5E-3737-B5F7-495BFA238F88 2016-06-02 14:38:46.5780000 -04:00 23.121845 1 

Тип 0 для температуры и влажности 1 для я понятия не имеют. как написать sql, чтобы получить результат, объединенный как

SensorId        Reading_Time      Temp  Humidity 
A3C3EB0B-1F5E-3737-B5F7-495BFA238F88 2016-06-02 14:38:16.4980000 -04:00 24.782219 23.121845 
A3C3EB0B-1F5E-3737-B5F7-495BFA238F88 2016-06-02 14:38:46.5780000 -04:00 24.77972 23.121845 

У меня есть 2 решения отсюда? Кто-нибудь есть представление о том, что быстрее и лучше?

+1

Какое программное обеспечение для баз данных? SQL Server, MySQL, PostgreSQL и т. Д.? – Nicarus

+0

Создайте индекс на read_time (необязательно) и присоедините таблицу к себе, где match_time совпадает, но типы не равны. – JustinDanielson

+0

Microsoft SQL Server –

ответ

2

Один из способов сделать это - использовать условные агрегаты, что является хорошим способом сделать эту работу с любой базой данных.

select sensorId, 
     reading_time, 
     min(case when type = 0 then value end) as Temp, 
     min(case when type = 1 then value end) as Humidity 
    from tbl 
group by sensorId, reading_time 
+1

Правильный подход, но вы не должны включать 'read_time' в агрегацию, но вместо этого включаете его в предложение' group by'. – sgeddes

+0

@sgeddes: вы правы. – sstan

+0

Это прекрасно работает Спасибо –

1

Попробуйте это:

WITH temperature (sID, rTime, temp) 
AS (SELECT sensorid, reading_time, value FROM data_table WHERE type=0) 
SELECT sensorid, reading_time, temp, value as humidity 
FROM data_table JOIN temperature ON sensorid=sID AND reading_time=rTime 
WHERE type=1 

Объяснение:

  • WITH создать временную таблицу для температуры со всех рядов температуры
  • Таблицы JOIN по времени и датчиком
  • Выбор температуры из временной таблицы и влажности из исходной таблицы для каждой пары датчиков-датчиков
+0

Спасибо, это тоже отлично работает. –

+0

Единственное замечание - проверить эффективность этих двух методов, я не полностью понимаю использование agreg. funcs в первом ответе, но возможно, что они будут работать быстрее. Однако это странное решение, и, как правило, сервер DB оптимизирует операторы WITH и работает быстрее, чем вы думаете. – TEXHIK

Смежные вопросы