Я использовал LAG () , чтобы выполнить это в Vertica, используя временные таблицы.
CREATE LOCAL TEMPORARY TABLE IF NOT EXISTS table1
(
vid int
,prod varchar
)
ON COMMIT PRESERVE ROWS;
Вставьте ваши данные (vid, prod) в эту таблицу.
Создать вторую временную таблицу, добавив столбец для данных LAG ()
CREATE LOCAL TEMPORARY TABLE IF NOT EXISTS table2
(
vid int
,prod varchar
,prod2 varchar
)
ON COMMIT PRESERVE ROWS;
INSERT INTO table2
SELECT vid, prod,
LAG(prod, 1, 0) OVER
(PARTITION BY vid ORDER BY vid) as prod2
FROM table1
GROUP BY vid, prod
HAVING COUNT(vid) > 1
ORDER BY vid
В Table2 теперь есть все комбинации в одном ряду.
vid prod prod2
1001 fixed other
1001 other 0
1002 mobile other
1002 other 0
1003 other 0
1004 fixed 0
1005 mobile 0
Вы можете ограничить результаты, используя логику регистра (моя логика может быть немного не здесь)
SELECT vid, prod, prod2,
CASE WHEN (((prod = 'mobile') AND (prod2 = 'fixed')) OR ((prod = 'fixed') AND (prod2 = 'mobile'))) THEN 'fixed_mobile'
WHEN ((prod = 'fixed' OR prod2 != 'mobile') OR (prod != 'mobile' AND prod2 != 'fixed')) THEN 'fixed'
WHEN ((prod != 'fixed' OR prod2 = 'mobile') OR (prod = 'mobile' AND prod2 != 'fixed')) THEN 'mobile'
ELSE 'none'
END AS prod2
FROM(SELECT vid, prod, prod2
FROM table2 WHERE prod2 != '0') s1
Результаты:
vid prod prod2
1002 mobile mobile
1001 fixed none
Наконец, вы можете вставить эти данные в другую таблицу (table3) и просто выполнить простое объединение для отображения результатов:
SELECT t1.vid, t1.prod, t2.prod3
FROM table1 t1
left join table3 t2
on t2.vid = t1.vid
Очевидно, что вы могли бы достичь того же результата только с помощью подзапросов, но это кажется немного чище. Как вы можете видеть ниже, есть некоторые случаи, когда у вас есть два разных vid
случая, оценивающих true. Например, vid=1003
имеет fixed
, mobile
и other
.
vid prod prod3
1001 fixed fixed
1001 fixed fixed
1001 fixed fixed
1001 other fixed
1001 other fixed
1001 other fixed
1002 mobile fixed
1002 mobile fixed
1002 other fixed
1002 other fixed
1003 fixed fixed
1003 fixed fixed_mobile
1003 fixed fixed
1003 fixed fixed_mobile
1003 mobile fixed
1003 mobile fixed_mobile
1003 mobile fixed
1003 mobile fixed_mobile
1003 other fixed
1003 other fixed_mobile
1003 other fixed
1003 other fixed_mobile
1004 fixed (null)
1004 fixed (null)
1005 mobile (null)
1005 mobile (null)