Я работаю над двумя таблицами: T_mono, T_multi, выглядит следующим образом:
T_multi [ID, NB_RECEIVER, GLOBAL_PERFORMANCE]
T_mono [ID_TRANSMITER, ID_RECEIVER, PERFORMANCE]
NB_RECEIVER варьируется от 1 до 200. Я хочу создать таблицу, объединяющую Transmitter, его глобальныйпроизводительность, а также идентификатор и характеристики 5 лучших приемников (в соответствии с их монофонической производительностью), когда в передатчике имеется 5 или более приемников с монофонической производительностью> 0,1. Если бы оно было меньше, я бы взял все ID_RECEIVERS и PERFORMANCES> 0.1.
Таблица результатов должна выглядеть следующим образом:
[ID_TRANSMITER, NB_RECEIVER, GLOBAL_PERFORMANCE, RECEIVER_1, PERF_1, RECEIVER_2, PERF_2,RECEIVER_3, PERF_3,RECEIVER_4, PERF_4,RECEIVER_5, PERF_5]
Если RECEIVER_1 имеет лучший результат, RECEIVER_2 - второй лучший результат и т. Д. (Он также может быть в массиве)
Пока что я ограничился записью с точным количеством из 5 приемников и использовал ARRAY_AGG , но нашел бы лучшее решение. Я попытался с RANK OVER(PARTTION BY ID_TRANSMITTER ORBER BY PERFORMANCE DESC)
следующим образом:
WITH mono AS(
SELECT
ID_TRANSMITER,
ID_RECEIVER,
PERFORMANCE,
RANK() OVER(PARTITION BY ID_TRANSMITER ORDER BY PERFORMANCE DESC)
FROM
T_multi
)
SELECT
ID,
NB_RECEIVER,
GLOBAL_PERFORMANCE
mono1.ID_RECEIVER, mono1.PERFORMANCE,
mono2.ID_RECEIVER, mono2.PERFORMANCE,
...
FROM
T_multi
LEFT JOIN
T_mono mono1
ON T_multi.ID = mono1.ID_TRANSMITER AND mono1.RANK = 1
LEFT JOIN
T_mono mono2
ON T_multi.ID = mono1.ID_TRANSMITER AND mono1.RANK = 2
...
WHERE
mono1.PERFORMANCE >0.1 AND mono2.PERFORMANCE >0.1 AND ...
Однако я не могу объяснить, почему в некоторых строках у меня есть mono2.PERFORMANCE NULL, но mono3.PERFORMANCE не равно NULL (тогда как значения сортируются в desc, так что если 3 не равно нулю, 2 тоже не должно быть и будет выше). Есть мысли?