Мне нужен способ сделать конкатенацию всех строк (на группу )в своего рода оконной функции, как вы можете сделать 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');