我需要一种方法来在一种窗口函数中连接所有行(每组),就像你可以做的那样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');