Разделите столбец SQLite на значение другого столбца

#sql #sqlite #pivot #aggregate-functions

#sql #sqlite #сводная #агрегатные функции

Вопрос:

У меня есть база данных, в которой несколько переменных отображаются в виде последовательных строк (показано ниже, переменные различаются по их тегам). В результате их значения отображаются в виде последовательных строк в столбце «значение».

Существующая таблица:

Существующая таблица

Для анализа данных мне нужно разделить значение каждой переменной на отдельные столбцы, как показано ниже.

Желаемая планировка

Запрос SQLite приведен ниже. Я пытался использовать ГРУППИРОВКУ по тегу и усреднение значений, но результат становится слишком детализированным, чтобы быть полезным.

Совет был бы очень признателен!

 SELECT
        tag
        ,time
        ,value
FROM 
    [archive]..[interp]
WHERE 
    tag 
IN
    ( 'flow1.Val'           
     , 'flow2.Val'
     , 'density1.Val' 
     , 'density2.Val'
     )
  
AND 
    time 
BETWEEN 
    't-1d' and 't'
AND 
    timestep = '1h'
 

Ответ №1:

Вы можете использовать условную агрегацию:

 select time,
    max(case when tag = 'flow1.Val' then value end) as flow1_val,
    max(case when tag = 'flow2.Val' then value end) as flow2_val,
    max(case when tag = 'density1.Val' then value end) as density1_val,
    max(case when tag = 'density2.Val' then value end) as density2_val
from [archive]..[interp]
group by time
 

В зависимости от ваших фактических требований вы можете использовать другую агрегатную функцию, чем max() , если у вас есть более одной строки для заданного времени / кортежа тегов.