У меня есть таблица MCU_RAW с повторяющейся последовательностью переменных, которые меняются. Есть 23 разных переменных.SQL Oracle - Pivot с синхронизацией
SELECT DISTINCT(N_CODE) "Code"
FROM MCU_RAW
WHERE N_LOGTYPE = 2
AND F_VALUE is not NULL
ORDER BY N_CODE
--All Rows Fetched: 23 in 17,775 seconds
--[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]
Авансовый масштабируется просмотр фактических данных из
SELECT to_char(D_ENTRY, 'YYYY-MM-DD HH24:mi:SS') "DateTime"
, N_MS "MS"
, N_CODE "Code"
, F_VALUE
FROM mcu_raw
WHERE N_LOGTYPE = 2
AND F_VALUE is not null
AND d_entry < to_Date('2014-10-01 19:04:52', 'YYYY-MM-DD HH24:MI:SS');
будет выглядеть
DateTime MS Code F_VALUE
2014-09-05 09:37:52 153 1 1
2014-09-05 09:37:52 215 2 0
2014-09-05 09:37:52 246 3 3
2014-09-05 09:37:52 278 1 1
2014-09-05 09:37:52 324 2 0
2014-09-05 09:37:52 340 4 292439
2014-09-05 09:37:52 402 1 1
2014-09-05 09:37:52 480 2 0
2014-09-05 09:37:52 512 5 17,26
2014-09-05 09:37:52 605 1 1
2014-09-05 09:37:52 652 2 0
2014-09-05 09:37:52 683 6 24,96
2014-09-05 09:37:52 714 1 1
2014-09-05 09:37:52 777 2 0
2014-09-05 09:37:52 824 7 110
2014-09-05 09:37:53 104 1 2
2014-09-05 09:37:53 136 2 3
2014-09-05 09:37:53 215 3 4
То, что я хотел бы сделать, это повернуть данные из MCU_RAW в другой который я создал. Для того, чтобы строка содержала данные времени из первого кода в последовательности, а затем столбец для каждого кода содержит самое последнее значение.
SELECT to_char(D_ENTRY, 'YYYY-MM-DD HH24:mi:SS') "DateTime"
, N_MS "MS"
, C0001
, C0002
, C0003
, C0004
, C0006
, C0007
FROM MCU
Желаемая выход из пуха масштабируется предварительного просмотра:
DateTime MS C0001 C0002 C0003 C0004 C0005 C0006 C0007
2014-09-05 09:37:52 153 1 0 3 (null) (null) (null) (null)
2014-09-05 09:37:52 278 1 0 3 292439 (null) (null) (null)
2014-09-05 09:37:52 402 1 0 3 292439 17,26 (null) (null)
2014-09-05 09:37:52 605 1 0 3 292439 17,26 24,96 (null)
2014-09-05 09:37:52 714 1 0 3 292439 17,26 24,96 110
2014-09-05 09:37:53 104 2 3 4 292439 17,26 24,96 110
То, что я сделал до сих пор вставляется код 1, чтобы получить правильный выбор времени для каждой строки.
INSERT INTO mcu (D_ENTRY, N_MS, C0001)
SELECT D_ENTRY, N_MS, F_VALUE
FROM MCU_raw
WHERE N_CODE = 1
AND N_LOGTYPE = 2
AND F_VALUE is not null
AND d_entry < to_Date('2014-10-01 19:04:52', 'YYYY-MM-DD HH24:MI:SS')
ORDER BY D_ENTRY, N_MS;
Отсюда я продолжаю стучать головой о стену, пытаясь выяснить, как обновить каждую строку с последним значением для каждого столбца.
EDIT: Я решил использовать N_MS из первого вхождения N_CODE = 1 в повторяющейся последовательности.
F_VALUE WHERE N_CODE = 1 is C0001
F_VALUE WHERE N_CODE = 2 is C0002
F_VALUE WHERE N_CODE = 3 is C0003
и т.д ...
Вам нужно объяснить правила игры здесь. Как вы решаете, какие значения N_MS взять? Как вы решаете, следует ли назначать F_VALUE на C0001 или C0007? – APC