@2g1c

Postgresql, как получить строки таблицы, попадющие под интервалы записанные в таблице с интервалами?

у меня есть таблица t. значения в столбце t.sequence упорядоченные и уникальные.
есть таблица t_intervals со столбцами id - id интервала, start и end - которые указывают на t1.sequence.

я могу получить данные из t для 1 интервала, например так:
WITH interval AS(
	SELECT start, end from t_intervals 
	WHERE id=10
	)
SELECT * FROM t
WHERE sequence BETWEEN (select start from interval) 
	AND (select end FROM interval);


но я бы хотел получить получить данные для нескольких интервалов и для заранее известного их количества могу сделать так:
WITH interval1 AS(
	SELECT start, end from t_intervals 
	WHERE id=10
	),
	interval2 AS(
	SELECT start, end from t_intervals 
	WHERE id=20
	)
SELECT * FROM t WHERE 
	WHERE sequence BETWEEN (select start from interval1) 
		AND (select end FROM interval1)
	OR sequence BETWEEN (select start from interval2) 
		AND (select end FROM interval2);

но я могу фильтровать t_intervals по разным правилам и не могу знать сколько интервалов под них попадет, поэтому я бы хотел иметь что-то вроде этого:
WITH intervals AS(
	SELECT start, end from t_intervals
	WHERE id in (2,10,30, ..., n)
	)
SELECT * FROM t 
WHERE OR_ROWS(
	sequence BETWEEN (select start from intervals)
	AND (select end FROM intervals)
);


где OR_ROWS сгенерирует условие:
sequence BETWEEN (select start from intervals) AND (select end FROM intervals)

для каждой строки.

как сделать что-то подобное? Спасибо.
  • Вопрос задан
  • 73 просмотра
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
Полное ощущение, что нужно нечто типа
SELECT [DISTINCT] t.*
FROM t
JOIN t_intervals ti ON t.sequence BETWEEN ti.start AND ti.end
WHERE ti.id in (2,10,30, ..., n)

Если интервалы в t_intervals гарантированно не пересекаются (хотя я лично фиг знает как это организовать в виде констрейнтов, а триггерная логика - ниачём), то DISTINCT не требуется.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы