【问题标题】:SQL Server - Concatenate previous 5 rowsSQL Server - 连接前 5 行
【发布时间】:2020-01-15 14:34:20
【问题描述】:

我有一个 sql 代码,它在分区和排序后在 column1 中创建前 5 行的平均值:

CAST (AVG(col1) OVER (Partition by col2 ORDER BY col3 ASC ROWS BETWEEN 5 PRECEDING AND 1 PRECEDING) AS DECIMAL(3,2)) AS col1avg

我想做类似的事情,但不是平均 5 个值,而是要创建一个字符串,其中 5 个值用逗号分隔。 我尝试了多种想法,但都没有成功。任何帮助将不胜感激。

【问题讨论】:

  • (1) 提供样本数据和期望的结果。 (2) 您的代码与SQL Server 2008 不兼容。请用正确的SQL Server 版本标记问题。

标签: sql sql-server concat coalesce


【解决方案1】:

SQL Server 2012+ 中最简单的方法是使用CONCAT()LAG()

select CONCAT(LAG(col1, 1) OVER (PARTITION BY col2 ORDER BY col3), ',',
              LAG(col1, 2) OVER (PARTITION BY col2 ORDER BY col3), ',',
              LAG(col1, 3) OVER (PARTITION BY col2 ORDER BY col3), ',',
              LAG(col1, 4) OVER (PARTITION BY col2 ORDER BY col3), ','
              LAG(col1, 5) OVER (PARTITION BY col2 ORDER BY col3)
             )

如果您需要处理 NULL 值,这有点棘手。我建议使用空格、修剪和替换:

select REPLACE(RTRIM(CONCAT(LAG(col1, 1, '') OVER (PARTITION BY col2 ORDER BY col3), ' ',
                            LAG(col1, 2, '') OVER (PARTITION BY col2 ORDER BY col3), ' ',
                            LAG(col1, 3, '') OVER (PARTITION BY col2 ORDER BY col3), ' ',
                            LAG(col1, 4, '') OVER (PARTITION BY col2 ORDER BY col3), ' ',
                            LAG(col1, 5, '') OVER (PARTITION BY col2 ORDER BY col3)
                           )
                    ), ' ', ','
              )

【讨论】:

  • 谢谢。第一个解决方案效果很好(一旦我在每个 ',' 后添加了一个额外的逗号)。随时更新,我会标记为完成。
猜你喜欢
  • 1970-01-01
  • 2021-03-02
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多