Две таблицы объединяются по числовому интервалу - PullRequest
0 голосов
/ 06 мая 2018

Здравствуйте, у меня есть две таблицы SQL, сначала они выглядят так:

| id | position | name  |
|----|----------|-------|
| 1  | 553      | John  |
| 2  | 876      | James |
| 3  | 999      | Jack  |

А второй вот так:

| id | class  | interval_start | interval_end |
|----|--------|----------------|--------------|
| 1  | class1 | 500            | 580          |
| 2  | class2 | 600            | 700          |
| 3  | class3 | 900            | 1200         |

И я хотел бы добавить класс из второй таблицы в первую таблицу на основе интервала (если t1.position больше, чем start и меньше, чем end - добавьте еще один столбец с классом) Итак, результат должен быть:

| id | position | name  | class  |
|----|----------|-------|--------|
| 1  | 553      | John  | class1 |
| 2  | 876      | James |        |
| 3  | 999      | Jack  | class3 |

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

Какой способ, по вашему мнению, будет оптимальным для этой задачи?

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Вы можете попробовать ниже SQL, он будет соответствовать вашим требованиям.

select  t1.id,
        t1.position,
        t1.name,
        t2.class
from table1 t1
 left join table2 t2
   on (t1.id = t2.id
    and t1.position between t2.interval_start and t2.interval_end
       );

Выход:

+------+----------+-------+--------+
| id   | position | name  | class  |
+------+----------+-------+--------+
|    1 |      553 | John  | class1 |
|    3 |      999 | Jack  | class3 |
|    2 |      876 | James | NULL   |
+------+----------+-------+--------+
0 голосов
/ 06 мая 2018

Вы можете использовать left join:

select t1.*, t2.class
from table1 t1 left join
     table2 t2
     on t1.position between t2.interval_start and t2.interval_end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...