Как объединить таблицу с диапазоном значений из другой таблицы? - PullRequest
0 голосов
/ 23 февраля 2020

В настоящее время я отчаянно пытаюсь объединить два стола. Но обычно, когда вы хотите объединить две таблицы, они объединяются, только если сами значения равны с обеих сторон. Я ищу соединение, которое присоединяется, если значение находится в пределах интервала. Позвольте мне объяснить:

У меня есть эти таблицы:

inscription(studentNumber, note)
thresVal(threshold, value)

табличная надпись выглядит примерно так:

studentNumber | note 
--------------+------
123           | 78   
456           | 65   
789           | 52   
012           | 90   
345           | 37   

и tresVal выглядит так:

 treshold | value
----------+--------
       90 |    4.3
       85 |      4
       80 |    3.7
       77 |    3.3
       73 |      3
       70 |    2.7
       65 |    2.3
       60 |      2
       57 |    1.7
       54 |    1.3
       50 |      1 
       35 |    0.5
        0 |      0

Теперь мне нужно объединение, которое проверяет, в каком диапазоне находится заметка учащегося, и соответственно добавляет строку «значение», например:

studentNumber | note | value
--------------+-------
123           | 78   | 3.3
456           | 65   | 2.3
789           | 52   | 1
012           | 90   | 4.3
345           | 37   | 0.5

Как видите диапазон находится между значением строки и его предшественником. нота 65 больше или равна порогу 65, поэтому ее значение должно быть 2,3. Все заметки от 65 до 69 должны иметь значение 2,3 и т. Д.

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

1 Ответ

0 голосов
/ 23 февраля 2020

«Обычно ... присоединяются, только если сами значения равны с обеих сторон» - ну и что! Это является результатом более ранних попыток вызвать это состояние, а не быть естественным. И ничего не требует обычным способом. Если вам не подходит эта ситуация, тогда настройте соединение, как вам нужно. В этом случае вам нужно присоединиться к диапазону значений - так и сделайте. Следующее даст вам именно это. CTE использует оконную функцию LEAD для объединения значения из следующей строки в текущую строку и создает открытый, закрытый диапазон. Этот диапазон затем присоединяется к надписи в результирующем диапазоне.

with tresVal_range as 
     (select int4range(treshold, coalesce(lead(tresHold) over(order by treshold), 10000),'[)') treshold, value
        from tresVal
     )
select i.studentnumber,i.note, t.value
  from inscription   i
  join tresval_range t
    on i.note <@ t.treshold
 order by i.studentnumber;    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...