我正在寻找一种将不同行中的字符串聚合为一行的方法。我希望在许多不同的地方进行此操作,因此具有促进此操作的功能会很好。我已经尝试过使用COALESCE
和解决方案FOR XML
,但它们只是不适合我。
字符串聚合将执行以下操作:
id | Name Result: id | Names
-- - ---- -- - -----
1 | Matt 1 | Matt, Rocks
1 | Rocks 2 | Stylus
2 | Stylus
我看过CLR定义的聚合函数来代替COALESCE
和FOR XML
,但是显然 SQL Azure 不 支持CLR定义的东西,这让我很痛苦,因为我知道能够使用它可以解决很多问题。我的问题。
有什么可能的解决方法,或者类似的最优方法(可能不如CLR最优,但是我会 尽力而为 )来聚合我的东西?
解决方案
最佳 的定义可能会有所不同,但是这是使用常规Transact SQL将不同行中的字符串连接起来的方法,该方法在Azure中应该可以正常工作。
;WITH Partitioned AS
(
SELECT
ID,
Name,
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Name) AS NameNumber,
COUNT(*) OVER (PARTITION BY ID) AS NameCount
FROM dbo.SourceTable
),
Concatenated AS
(
SELECT
ID,
CAST(Name AS nvarchar) AS FullName,
Name,
NameNumber,
NameCount
FROM Partitioned
WHERE NameNumber = 1
UNION ALL
SELECT
P.ID,
CAST(C.FullName + ', ' + P.Name AS nvarchar),
P.Name,
P.NameNumber,
P.NameCount
FROM Partitioned AS P
INNER JOIN Concatenated AS C
ON P.ID = C.ID
AND P.NameNumber = C.NameNumber + 1
)
SELECT
ID,
FullName
FROM Concatenated
WHERE NameNumber = NameCount
解释
该方法可归结为三个步骤:
使用数字对行进行编号,OVER
并PARTITION
根据需要对它们进行分组和排序。结果是Partitioned
CTE。我们保留每个分区中的行数,以便以后过滤结果。
使用递归CTE(Concatenated
)遍历行号(NameNumber
列),将Name
值添加到FullName
列中。
过滤掉所有结果,但结果最高的那些NameNumber
。
请记住,为了使该查询可预测,必须定义分组(例如,在您的方案中具有相同行的行ID
)和排序(我假设您只是在串联之前按字母顺序对字符串进行排序)。
我已经使用以下数据在SQL Server 2012上快速测试了该解决方案:
INSERT dbo.SourceTable (ID, Name)
VALUES
(1, 'Matt'),
(1, 'Rocks'),
(2, 'Stylus'),
(3, 'Foo'),
(3, 'Bar'),
(3, 'Baz')
查询结果:
ID FullName
----------- ------------------------------
2 Stylus
3 Bar, Baz, Foo
1 Matt, Rocks
问题内容: 串联String对象列表的最佳方法是什么?我正在考虑这样做: 我以某种方式发现这比使用StringBuilder / StringBuffer方法更整洁。 有什么想法/意见吗? 问题答案: 您的方法取决于Java的ArrayList#toString()实现。 尽管实现是用Java API记录的,并且不太可能更改,但仍有可能实现。自己实现这一点要可靠得多(循环,StringBuilde
问题内容: 给出以下无害的小清单: 我的目标是使用以下方法之一以Python方式串联小恶魔: A. plain ol’string函数来完成工作,简短,没有导入 B.lambda,lambda,lambda C.全球化(什么都不做,什么都导入) 请提出其他蟒蛇般的方法来完成这项宏大的任务。 请对解决方案进行排名(python级别),并对解决方案进行评分,并给出简洁的解释。 在这种情况下,最Pyth
问题内容: 在vertica中有一个表:像这样测试: 如何使用聚合函数或如何编写查询以获取像这样的数据(vertica语法)? 问题答案: 首先,您需要为编译udx 。 然后,您可以执行如下查询: 使用rtrim摆脱最后一个’,’。 如果您需要以某种方式对聚合进行排序,则可能需要在嵌入式视图中或使用first进行选择/排序。
问题内容: 我在尝试搜索字符串中的子字符串时遇到问题。该子字符串可能在字符串中也可能不在字符串中。 我知道是否可以完成的两种方法是: 正则表达式 但是,还有其他“优化”方式吗?你会怎么做? Ruby可以提供更好的答案吗?由于我们使用jRuby,因此答案可以是Ruby或Java。 问题答案: 在Ruby中,使用方法: 返回。
问题内容: 在JavaScript中,我有一个包含许多迭代的循环,并且在每个迭代中,我正在创建一个包含许多运算符的巨大字符串。有没有更有效的方式来创建字符串?我正在考虑创建一个动态数组,在该数组中不断向其中添加字符串,然后进行联接。谁能解释并举例说明最快的方法吗? 问题答案: 基于JSPerf的基准测试,似乎是使用最快的方法,尽管不一定在每个浏览器中都使用。 为了在DOM中构建字符串,最好先将字符
问题内容: 使类型代表一组字符串的最佳方法是什么? 我尝试了这个: 然后如何将它们用作? 问题答案: 我不知道您想做什么,但这是我实际上翻译示例代码的方式。 另外,您可以为创建一个getter方法。 你现在可以做