连接/聚合字符串的最佳方法

2023-12-01

我正在寻找一种将不同行的字符串聚合到一行中的方法。我希望在许多不同的地方做到这一点,所以有一个函数来促进这一点会很好。我尝试过使用解决方案COALESCE and FOR XML,但他们就是不适合我。

字符串聚合会做这样的事情:

id | Name                    Result: id | Names
-- - ----                            -- - -----
1  | Matt                            1  | Matt, Rocks
1  | Rocks                           2  | Stylus
2  | Stylus

我看过了CLR 定义的聚合函数作为替代品COALESCE and FOR XML,但显然SQL Azure does not支持 CLR 定义的东西,这对我来说是一个痛苦,因为我知道能够使用它会为我解决很多问题。

是否有任何可能的解决方法,或类似的最佳方法(可能不如 CLR 最佳,但hey我会拿我能得到的东西)来聚合我的东西?


SOLUTION

的定义optimal可能会有所不同,但以下是如何使用常规 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

解释

该方法可归结为三个步骤:

  1. 使用以下方法对行进行编号OVER and PARTITION根据串联的需要对它们进行分组和排序。结果是Partitioned热膨胀系数。我们保留每个分区中的行数以便稍后过滤结果。

  2. 使用递归 CTE (Concatenated) 迭代行号 (NameNumber列)添加Name价值观FullName column.

  3. 过滤掉除了最高的结果之外的所有结果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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

连接/聚合字符串的最佳方法 的相关文章

随机推荐

  • Mac 用户收到警告:Nokogiri 是针对 LibXML 版本 2.7.8 构建的,但已动态加载 2.7.3

    我做了各种各样的研究并尝试了很多不同的事情 我知道这个问题已经被回答过很多次了 但是所有建议的解决方案都不适合我 升级到 Lion 后 我在 Ruby 中遇到分段错误 我相当有信心那是Nokogiri 所以我通过 Homebrew 安装了
  • gnuplot 标题和轴标签被切成一半

    我已将图表标题以及 x 和 y 轴标签的字体大小更改为双倍大小 现在标题和轴标签更大了 但它们被切成两半并延伸到图表本身 是否有一个选项可以设置标题的边距 以便完整地绘制它们并且不会触及图表 我使用 gnuplot 4 6 patchlev
  • Json提取和使用数据(node.js)

    我如何访问这些数据 这是我的 Json 6a768d67 82fb 4dd9 9433 d83dbd2f1b78 name Bahut 11 timestamp 1380044486000 value false 4f4a65e4 c41b
  • 从 WP7 上传 XML 文件,可能吗?如何上传?

    我正在研究一个系统 用户可以将 xml 文件上传到网站以供其他人稍后下载 我在这个部门的经验很少 真的不知道从哪里开始 所以这是一个相当简单的问题 我该如何实施这样的事情 我需要 ASP 托管还是其他东西 是的 您需要某种形式的网站 服务托
  • Angular JS 类型号在 Firefox 中不起作用

    请检查此代码
  • 无法将 TextMeshPro 文本获取到 Unity 中的变量槽

    using TMPro public TextMeshPro livesText public TextMeshPro scoreText 我无法将文本从层次结构拖动到检查器中的变量槽 为什么会这样 请帮忙 你似乎在谈论一个TextMesh
  • Swift 3.0 - 用手指在 imageView 上绘图

    我一直致力于使用 swift 3 0 在图像视图上绘制红线 并遇到了一些问题 正如您可能猜到的那样 我正在使用堆栈溢出中的一些代码来帮助我进行第一次初步尝试 但遇到了一个奇怪的错误 当我在图像视图上拖动手指时 它确实绘制了一条红线 但对于每
  • currentUser() 不是工作类型,为什么我看到表达式的计算结果不是函数,因此无法调用它

    我是 Flutter 的新手 我正在开发一个简单的身份验证应用程序 当我注册时 我应该导航到聊天屏幕 并且我想获取当前用户 但是当我调用 FireBaseAuth instance currentUser 时 我得到了一个异常 表达式的计算
  • 获取传递给函数的所有参数和值

    我有一个Python函数 fetch data 它会访问远程 API 获取一些数据 然后将其包装在响应对象中返回 它看起来有点像下面这样 def fetch data self foo bar baz kwargs response Res
  • Google Apps 脚本的 V8 运行时 [重复]

    这个问题在这里已经有答案了 上周谷歌发布了新的Runtime 谁知道使用哪个版本的 V8 或 ECMAScript As per 将脚本迁移到 v8 文档 V8 标准 合规 但是 当将脚本迁移到 V8 时 可能会出现以下情况 一些不兼容的情
  • 为什么声明顺序对于通用成员很重要?

    今天我注意到以下内容无法编译 open System type MyType member this Something this F 3 this F boo This expression was expected to have ty
  • 使用 Google Maps JavaScript API v3 突出显示某个区域

    我想突出显示如下图所示的区域 该区域取自谷歌地图 使用当前版本的 API v3 可以实现这一点吗 如果是 怎么办 提前致谢 您需要知道该区域的顶点并根据它们创建多边形 但多边形目前不支持虚线描边 如果您需要虚线描边 则必须根据顶点创建具有不
  • 画布内部的 tkinter 框架未扩展以填充区域

    我有一个可滚动框架类 是从我发现的一些代码中借用的 但我无法调整它以满足我的需求 它是由 pack 管理的 但我需要使用 grid 所以我简单地打包了一个框架 self region 到它里面 这样我就可以在里面网格我的小部件 但是 该框架
  • jQuery(this) 和外部接口

    大家好 我有ExternalInterface 来调用javascript 函数 但是我现在如何使用 jQuery 来定位调用该函数的 swf 例如 我使用ExternalInterface 调用 changeObject 函数 我如何让
  • Java - 创建新文件,如何使用方法指定目录?

    我知道如何写一个file执行以下操作到指定目录 public void writefile try Writer output null File file new File C results results txt output new
  • PushViewController 花费太多时间来显示视图

    我有一个非常轻的 ViewController 它在 viewDidLoad 中什么也不做 我将此视图推到导航控制器之上 执行此操作的方法是从块内部调用的 调用 showView 后 我添加了一个 NSLog 该日志在控制台中打印得非常快
  • 在单独的 .kv (Kivy) 文件中定义的屏幕之间切换

    我曾经通过在单个 kv 文件中定义所有内容 包括屏幕 来设法使多屏幕程序运行 通过使用root current 在 kv 文件中 或self root current 在 Python 文件中 我能够在屏幕之间切换 然而 一旦存在多个包含许
  • 在用户交互之前,dgrid 0.4.0 树看起来很平坦

    尝试使用 dgrid 0 4 0 显示树结构 没有使用过以前版本 0 3 x 的经验 我用两个文件夹构建了这个示例 alice 和 bob 每个都会有一些文件 叶子 商店 astore js define dojo base declare
  • 如何在 bazel 中为 Python 和 pip 选择运行时?

    我正在尝试在 Ubuntu 20 04 上构建一个应用程序 其中 python3 指向 Python3 8 并且我正在构建 aganist Python3 6 我在 WORKSPACE 的同一目录中有以下运行时 cat BUILD baze
  • 连接/聚合字符串的最佳方法

    我正在寻找一种将不同行的字符串聚合到一行中的方法 我希望在许多不同的地方做到这一点 所以有一个函数来促进这一点会很好 我尝试过使用解决方案COALESCE and FOR XML 但他们就是不适合我 字符串聚合会做这样的事情 id Name