2017-02-10 1 views
0

Я хочу сократить этот результат, чтобы возвращать только строки, которые имеют надмножество всех строк и порядок чисел в столбце цепи имеет значениеВ Postgres можно отфильтровать строки с столбцом массива, значение которого является подмножеством значений, содержащихся в других строках с использованием sql

Лучше думать об этом как пути, например в ltree (но динамически generated-- в этом случае с использованием рекурсивного КТР)

si_id chain 
5 {3,5} 
5 {4,5} 
5 {8,5} 
2 {3,2} 
2 {4,2} 
1 {3,2,1} 
1 {3,5,1} 
1 {4,2,1} 
1 {4,5,1} 
1 {8,5,1} 

отредактирован, чтобы показать ожидаемый результат:

{3,2,1} 
{3,5,1} 
{4,2,1} 
{8,5,1} 
{4,5,1} 
+0

Что такое желаемый результат? –

+0

{3,5,1} {8,5,1} {4,2,1} {3,2,1} {4,5,1} – user7543032

+0

Это ожидаемый результат при использовании '' { 3,5} '' как «надмножество», например, в вашем вопросе? Результаты должны содержать 3 в первом элементе или 5 в секунду? Почему в результате присутствует «{4,2,1}»? –

ответ

0

Что-то вроде этого:

WITH search AS (
    SELECT '{3,5,1}'::int4[] AS search, 
      array_upper('{3,5,1}'::int4[], 1) AS search_len 
) 
SELECT * 
FROM s 
JOIN search ON (chain @> search) 
WHERE EXISTS (
     SELECT 1 
     FROM generate_series(1, array_upper(chain, 1) - search_len + 1) AS i 
     WHERE chain[i:(search_len + i - 1)] = search 
) 
+0

возвращает тот же результат, что и значение в cte, и если я изменяю значение на {3}, он также возвращает недопоставки i добавил комментарий по вопросу о том, какой желаемый результат будет спасибо! – user7543032

Смежные вопросы