Как объединить таблицы, чтобы значения правой таблицы зависели от двух разных строк в левой таблице? - PullRequest
1 голос
/ 11 августа 2011

Извините за грязный заголовок, если вы модератор и знаете лучший заголовок, смело меняйте.

Скажем, у нас есть две таблицы SQL

intervals           vals       
--------            -------    
since               val        
--------            -------    
 1                  1          
 4                  2          
 8                  3
 20                 4          
 ...                ...
 500                100

Я хочу сделать соединение так, чтобы поле "поскольку" из таблицы интервалов было нижней границей для "val". И значения «поскольку», у которых нет значения «val», которое больше, не появятся. Посмотри, что я хочу получить:

since val
--------------
1     1
1     2
1     3
4     4
4     5
4     6
4     7
8     8
8     9
.....

Как мне сделать это в универсальном SQL? Также подойдет решение только для Postgres.

Ответы [ 2 ]

3 голосов
/ 11 августа 2011

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

Это делает то, что вы хотите:

select i.since, v.val
from intervals i
join vals v on v.val between i.since and 
    (select min(since) - 1 from intervals where since > i.since)
order by 1, 2;

Тестовый код (запускается на postgres согласно вопросу ОП):

create table intervals (since int);
create table vals (val int);
insert into intervals values (1), (4), (8), (20), (500);
insert into vals values (1), (2), (3), (4), (5), (6), (7), (8), (9), (100);

Вывод вышеуказанного запроса:

1   1
1   2
1   3
4   4
4   5
4   6
4   7
8   8
8   9
20  100
2 голосов
/ 11 августа 2011

Кредит RhodiumToad на # postgresql

SELECT  * 
FROM    vals v 
JOIN    (select since
              , lead(since) over (order by since) as "end" 
         from intervals) s 
         ON ( v.val >= s.since 
             AND ((v.val >= s."end") IS NOT TRUE)
            )
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...