Ограничение и сортировка записей в сгруппированных данных - PullRequest
0 голосов
/ 06 ноября 2019

Я работаю над двумя таблицами: 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 тоже не должно быть и будет выше). Есть мысли?

...