SQL Server 2012 中的 group_concat 与 ORDER BY 另一列

2024-03-05

我有一个包含约一百万个条目的表,如下所示:

customer_id | purchased_at     | product
1           | 2012-06-01 00:00 | apples
1           | 2012-09-02 00:00 | apples
1           | 2012-10-01 00:00 | pears
2           | 2012-06-01 00:00 | apples
2           | 2012-07-01 00:00 | apples
3           | 2012-09-02 00:00 | pears
3           | 2012-10-01 00:00 | apples
3           | 2012-10-01 01:00 | bananas

我想将产品连接到一行,DISTINCT 并按照购买的顺序

在 MySQL 中我只是使用

select customer_id, min(purchased_at) as first_purchased_at, 
group_concat(DISTINCT product order by purchased_at) as all_purchased_products
from purchases group by customer_id;

to get

customer_id | first_purchased_at | all_purchased_products
1           | 2012-06-01 00:00 | apples, pears
2           | 2012-06-01 00:00 | apples
3           | 2012-09-02 00:00 | pears, apples, bananas

我怎样才能在 SQL Server 2012 中做到这一点?

我尝试了以下“黑客”,它有效,但它有点矫枉过正,并且在长桌上表现不佳

select
customer_id,
min(purchased_at) as first_purchased_at,
stuff ( ( select  ',' +  p3.product 
          from (select  p2.product, p2.purchased_at, 
          row_number() over(partition by p2.product order by p2.purchased_at) as seq
          from  purchases p2 where
          p2.customer_id = p1.customer_id ) p3 
          where p3.seq = 1 order by p3.purchased_at
          for XML PATH('') ), 1,1,'') AS all_purchased_products  
from purchases p1
group by customer_id;

我能做什么来解决这个问题?


我不确定这是否会更快,但这是一个替代版本,您无需加入purchases两次在STUFF():

select customer_id,
  min(purchased_at) as first_purchased_at,
  stuff ((select ',' +  p2.product 
          from
          (
            select product, customer_id,
                ROW_NUMBER() over(partition by customer_id, product order by purchased_at) rn,
                ROW_NUMBER() over(partition by customer_id order by purchased_at) rnk   
            from purchases
          ) p2 
          where p2.customer_id = p1.customer_id
            and p2.rn = 1
          group by p2.product, rn, rnk
          order by rnk
          for XML PATH('') ), 1,1,'') AS all_purchased_products  
from purchases p1
group by customer_id;

See SQL 摆弄演示 http://sqlfiddle.com/#!6/36f7c/5

Result:

| CUSTOMER_ID |               FIRST_PURCHASED_AT | ALL_PURCHASED_PRODUCTS |
---------------------------------------------------------------------------
|           1 |      June, 01 2012 00:00:00+0000 |           apples,pears |
|           2 |      June, 01 2012 00:00:00+0000 |                 apples |
|           3 | September, 02 2012 00:00:00+0000 |   pears,apples,bananas |
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server 2012 中的 group_concat 与 ORDER BY 另一列 的相关文章

  • 如何修复 SQL Server 中阿拉伯文与英文混合的反向字符

    我有一个 SQL Server 数据库 表列在同一字段中包含阿拉伯语和英语字符 就像Oracle 寻求您的帮助 将阿拉伯字符与英文字符分开以反转它们 因为阿拉伯字符在字段中没有特定的位置 开始 结束或中间 Edit这些字符来自旧版 IBM
  • Mysql 使用搜索字符串排序

    我有一个 mysql 查询 例如 select from employee where name like ani 我希望我的结果以 ani 开头排序 例如 我的结果应该是 anil anirudha rani 首先以 ani 开头 然后是
  • 使用带有 ORDER 子句的 AES_DECRYPT 在 MySQL 中返回 BLOB 数据

    我正在创建一个系统 用户可以在其中通过 PHP 和 MySQL 数据库存储消息 并且我使用 MySQL AES ENCRYPT 函数来加密这些消息的内容 这是我的posts table CREATE TABLE IF NOT EXISTS
  • H2数据库排序规则:选择什么?

    经过大量阅读和实验后 似乎我想要主要的搜索强度 但第三或相同的排序强度 主要问题 用 H2 或任何其他数据库 可以实现吗 第二个问题 我是这里唯一的人吗 或者你们中有人也喜欢上述组合吗 一些确认会对我的理智有所帮助 背景 看来排序规则只能在
  • 如何避免 OrderBy - 内存使用问题

    假设我们有一个很大的点列表List
  • 使用表达式动态决定打开哪个子报表

    我有一份报告 其中包含几页带有图表 表格等的内容 该报告由总是希望对报告进行小修改的不同客户使用 目前 如果客户想要对第 5 页进行更改 则会通过修改重新创建整个报告 即使唯一的更改是在第 5 页的图表中 更重要的是 一些客户不想看到第 3
  • 在触发器中记录更新操作

    我有一个 UPDATE 触发器 它生成 INSERTED 和 DELETED 表 如下所示 INSERTED Id Name Surname 1 Stack Overflow 2 Luigi Saggese DELETED Id Name
  • 将存储过程的结果加上额外的列插入表中

    如何在其中插入更多列dbFileListOnly表以及 EXEC 查询 INSERT INTO admindb dbfilelistonly path col1 col2 path EXEC RESTORE FILELISTONLY FRO
  • 分组和切换列和行

    我不知道这是否会被正式称为枢轴 但我想要的结果是这样的 Alex Charley Liza 213 345 1 23 111 5 42 52 2 323 5 23 1 324 5 我的输入数据采用这种形式 Apt Name
  • Mysql带限制的删除语句

    我试图从表中删除行 但出现错误 DELETE FROM chat messages ORDER BY timestamp DESC LIMIT 20 50 我在 50 时收到此错误 您的 SQL 语法有错误 检查与您的 MySQL 服务器版
  • INNER/RIGHT/LEFT JOIN 怎么会比 FULL JOIN 慢 14 倍?

    我有一个查询 使用 FULL JOIN 需要 2 5 秒 使用 INNER RIGHT 或 LEFT JOIN 需要 40 秒 这是查询 子查询 完成两次 本身只需要 1 3 秒 SELECT T1 time T1 Total T1 rn
  • 在 SQL Management Studio 2012 中调试

    我正在使用 Management Studio 2012 但无法调试任何 SQL 代码 在我点击 调试 按钮后 左侧没有看到任何绿色箭头 并且我的 SQL 对象都没有加载到内存中 当我将光标移到我设置的断点上时 我收到此消息 The bre
  • 生成脚本 - 仅数据 - 循环依赖项发现错误

    我正在尝试生成数据库中所有数据的脚本 以便我可以将数据移动到另一台服务器上的相同数据库 在 SQL Server 2012 中 我右键单击源数据库 任务 gt 生成脚本 gt 为整个数据库和所有数据库对象编写脚本 gt 高级 gt 要编写脚
  • max()、分组依据和排序依据

    我有以下 SQL 语句 SELECT t client id max t points AS max FROM sessions GROUP BY t client id 它只是列出了客户 ID 以及他们所获得的最大积分 现在我想按 max
  • PostgreSQL 如何对字段上的 b 树索引执行 ORDER BY?

    我有一张桌子bsort CREATE TABLE bsort a int data text Here data可能不完整 换句话说 某些元组可能没有data value 然后我在表上建立一个 B 树索引 CREATE INDEX ON b
  • 如何在 WP_Query 中按日期排序?

    我已经尝试过这种方式但是orderby and order不适用于 WP Query 类 posts new WP Query array post type gt block code orderby gt post date order
  • JPA @OrderBy() 通过关系表

    我需要一些有关 JPA 框架的帮助 我读过一些关于这个主题的 某种程度上 的答案 但我无法得出任何结论 首先这是我正在使用的设计示例 BusinessObject public class ClassA Column name ID nul
  • ORDER BY 之后的 GROUP BY

    我需要去做GROUP BY after ORDER BY 我不明白为什么 MySQL 不支持这一点 这是我的代码 SELECT pages id contents id language ORDER BY FIND IN SET langu
  • 需要在SQL Server 2012中自动递增字符串

    考虑 SQL Server 2012 中的表 789 0000000 上面的数字在 SQL Server 2012 中将被视为字符串 但每当我更新记录时 我都需要增加到 1 例如 当我更新记录 1 时 它应该增加到789 0000001 当
  • SQL Server 2008 R2 的 Try_Convert

    我正在使用 SQL Server 2008 R2 并且有一个VARCHAR我想要转换为的列DECIMAL 28 10 using CONVERT 但其中许多行的格式错误 因此无法将它们解析为数字 在这种情况下 我只想通过将结果设置为 0 或

随机推荐