Насколько я понимаю, вы хотите сгруппировать последовательные строки вместе. Это далеко не тривиально. По крайней мере, сейчас я не могу найти простого способа сделать это. Для простоты понимания я разобью запрос на несколько шагов:
Шаг 1:
Прежде всего, необходимо определить границы ваших «групп». Здесь вам может помочь аналитическая функция LAG
:
CASE WHEN LAG("c2", 1) OVER(ORDER BY "c1") = "c2"
AND LAG("c3", 1) OVER(ORDER BY "c1") = "c3"
THEN 0
ELSE 1
END CLK,
T.* FROM T
ORDER BY "c1"
Шаг 2:
Второй шаг – пронумеровать каждую из ваших групп. Простой SUM
над разделом поможет. Это приводит к:
SELECT SUM(CLK) OVER (ORDER BY "c1"
ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW) GRP,
V.*
FROM (
SELECT
CASE WHEN LAG("c2", 1) OVER(ORDER BY "c1") = "c2"
AND LAG("c3", 1) OVER(ORDER BY "c1") = "c3"
THEN 0
ELSE 1
END CLK,
T.* FROM T
) V
ORDER BY "c1";
Заключительный этап:
Наконец, вы можете обернуть это простым запросом GROUP BY
, чтобы получить желаемый результат:
SELECT MIN("c1"), MAX("c1"), "c2", "c3" FROM
(
SELECT SUM(CLK) OVER (ORDER BY "c1"
ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW) GRP,
V.*
FROM (
SELECT
CASE WHEN LAG("c2", 1) OVER(ORDER BY "c1") = "c2"
AND LAG("c3", 1) OVER(ORDER BY "c1") = "c3"
THEN 0
ELSE 1
END CLK,
T.* FROM T
) V
)
GROUP BY GRP, "c2", "c3"
ORDER BY GRP
См. http://sqlfiddle.com/#!4/7d57c/10.
person
Sylvain Leroux
schedule
08.11.2014