gpt4 book ai didi

sql - CONCAT(列)OVER(分区依据...)?对行进行分组连接而不对结果本身进行分组

转载 作者:行者123 更新时间:2023-12-02 10:27:11 24 4
gpt4 key购买 nike

我需要一种方法来在一种窗口函数中串联所有行(每组),就像如何执行 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一次,因此为什么我想知道是否可以对组串联进行窗口化(我是因为我有 MySQL 背景,所以对 TSQL 有点陌生,所以不确定是否可以完成类似的事情)。

<小时/>

创建表:

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');

最佳答案

在 sql 2017 中,您可以使用 STRING_AGG 函数:

SELECT STRING_AGG(T.val, ',') AS val
, T.grp
FROM @tbl AS T
GROUP BY T.grp

关于sql - CONCAT(列)OVER(分区依据...)?对行进行分组连接而不对结果本身进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12023933/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com