Объединить несколько строк в один столбец в тераданных sql - PullRequest
0 голосов
/ 14 июля 2020

Может ли кто-нибудь помочь с приведенными ниже примерами, большое спасибо

id   color   date 

1    red     01/01
1    red     01/02
1    yellow  01/03
1    red     02/01
2    red     01/01
2    blue    01/02
2    blue    02/02
3    red     01/01
4    red     02/01

Идеальный результат должен быть:

id    pattern 
1     (red, yellow) to (red)
2     (red, blue) to (blue)
3     (red)
4     (red)

Результат отображает две вещи:

  1. Уникальный паттерн в течение одного месяца
  2. должен агрегировать паттерн вместе во временных диапазонах

Например, мы можем видеть, что id_1 имеет паттерн изменения в январе с (красный, желтый), но в феврале у него только один узор (красный). Поэтому окончательный результат должен быть от (красный, желтый) до (красный)

Запрос, который у меня сейчас есть,

select drv.id, extract(month from date) as month,
trim(trailing',' from (XMLAGG(TRIM(color)',' order by date)(varchar(10000)))) as pattern from
(select id, color,
lag(color)over(partition by id, extract(month from date) order by date) as prev_color
from table
qualify prev_color <> color
) as drv
group by id, extract(month from date)

Запрос неполный, и он возвращает результат, как показано ниже, но Возможно ли, что мы сможем вернуть его по месяцам?

Есть ли способ, которым мы можем смешивать использование XMLAGG и разбиение по?

Кто-нибудь может дать какие-нибудь идеи? Большое спасибо!

1 Ответ

0 голосов
/ 15 июля 2020

Вам нужен GROUP BY id во внешнем запросе. Во внутреннем запросе вы можете отфильтровать строки «без изменений», но также необходимо включить столбец даты, чтобы вы могли ссылаться на него во внешнем запросе. По умолчанию XMLAGG добавляет пробел между элементами, но до тех пор, пока в значениях нет пробелов, вы можете легко перевести это на любой предпочитаемый вами разделитель. (Если могут быть встроенные пробелы, вы можете добавить разделитель к каждой записи с помощью оператора конкатенации || и обрезать последнюю, et c.)

select drv.id, 
oreplace(XMLAGG(TRIM(color) order by theDate)(varchar(10000)),' ','-') as pattern from
(select id, color, theDate,
lag(color)over(partition by id order by theDate) as prev_color
from theTable
qualify prev_color is null or prev_color <> color
) as drv
group by 1
order by 1

Я использовал theDate и theTable в этом примере, потому что DATE и TABLE - зарезервированные слова.

...