СЦЕПИТЬ (столбец )НАД (РАЗДЕЛИТЬ ПО… )?Группировать -объединение строк без группировки самого результата

Мне нужен способ сделать конкатенацию всех строк (на группу )в своего рода оконной функции, как вы можете сделать 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');
10
задан a_horse_with_no_name 12 July 2018 в 05:33
поделиться