Мне нужен способ сделать конкатенацию всех строк (для каждой группы) в виде оконной функции, например, как вы можете сделать COUNT(*) OVER(PARTITION BY...)
, и подсчет совокупности всех строк на группу будет повторяться через каждую конкретную группу. Мне нужно нечто подобное, но строка конкатенации всех значений для каждой группы повторяется в каждой группе.
Вот некоторые примеры данных и мой желаемый результат, чтобы лучше проиллюстрировать мою проблему:
grp | val
------------
1 | a
1 | b
1 | c
1 | d
2 | x
2 | y
2 | z
И вот что мне нужно (желаемый результат):
grp | val | groupcnct
---------------------------------
1 | a | abcd
1 | b | abcd
1 | c | abcd
1 | d | abcd
2 | x | xyz
2 | y | xyz
2 | z | xyz
Вот очень сложная часть этой проблемы:
Моя конкретная ситуация мешает мне иметь возможность ссылаться на одну и ту же таблицу дважды (я на самом деле делаю это в рекурсивном CTE, поэтому я не могу самостоятельно присоединяться к CTE или это вызовет ошибку).
Я полностью понимаю, что можно сделать что-то вроде:
SELECT a.*, b.groupcnct
FROM tbl a
CROSS APPLY (
SELECT STUFF((
SELECT '' + aa.val
FROM tbl aa
WHERE aa.grp = a.grp
FOR XML PATH('')
), 1, 0, '') AS groupcnct
) b
Но, как вы можете видеть, это ссылается на tbl
два раза в запросе.
Я могу ссылаться только на tbl
один раз, поэтому мне интересно, возможно ли оконтирование групповой конкатенации (я немного новичок в TSQL, поскольку я исхожу из фона MySQL, поэтому не уверен, что что-то подобное можно сделать).
Создать таблицу:
CREATE TABLE tbl
(grp int, val varchar(1));
INSERT INTO tbl
(grp, val)
VALUES
(1, 'a'),
(1, 'b'),
(1, 'c'),
(1, 'd'),
(2, 'x'),
(2, 'y'),
(2, 'z');