sql - 创建一个新列,其中包含另一列后续行中的值列表

标签 sql snowflake-cloud-data-platform

我有一个如下表,

current table

并且想要创建一个新列,其中包含来自另一列后续行的值列表,如下所示,

New Table

复制粘贴: 时间戳ID值

2021-12-03 04:03:45 ID1 O

2021-12-03 04:03:46 ID1 P

2021-12-03 04:03:47 ID1问

2021-12-03 04:03:48 ID1 R

2021-12-03 04:03:49 ID1 空

2021-12-03 04:03:50 ID1 S

2021-12-03 04:03:51 ID1 T

2021-12-04 11:09:03 ID2 A

2021-12-04 11:09:04 ID2 B

2021-12-04 11:09:05 ID2 C

最佳答案

使用窗口函数和范围 JOIN:

WITH cte AS (
  SELECT tab.*, 
     COALESCE(FIRST_VALUE(CASE WHEN VALUE IS NULL THEN tmp END) IGNORE NULLS 
                OVER(PARTITION BY ID ORDER BY TMP 
                ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
             ,MAX(tmp) OVER(PARTITION BY ID)) AS next_tmp
  FROM tab
)
SELECT c1.tmp, c1.id, c1.value,
      LISTAGG(c2.value, ',') WITHIN GROUP(ORDER BY c2.tmp) AS list
FROM cte c1
LEFT JOIN cte c2
  ON c1.ID = c2.ID
 AND (c1.tmp < c2.tmp AND c2.tmp <= c1.next_tmp)
GROUP BY c1.tmp, c1.id, c1.value
ORDER BY c1.ID, c1.tmp;

<强> db<>fiddle demo

输出:

enter image description here


它是如何工作的:

这个想法是找到与每个 ID 的 NULL 值相对应的第一个时间戳:

SELECT tab.*, 
 COALESCE(FIRST_VALUE(CASE WHEN VALUE IS NULL THEN tmp END) IGNORE NULLS 
            OVER(PARTITION BY ID ORDER BY TMP 
            ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
         , MAX(tmp) OVER(PARTITION BY ID)) AS next_tmp
FROM tab;

输出:

enter image description here

关于sql - 创建一个新列,其中包含另一列后续行中的值列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70457040/

相关文章:

SQL Server 2012 32位还是64位计算机上的64位?

mysql - 使用 "IF"时程序无法正常工作

sql - 您可以打印 SQL Server View 的图形表示吗?

python - 使用雪花连接器获取数据会引发 EmptyPyArrowIterator 错误

snowflake-cloud-data-platform - 如何将 NULL 替换为雪花中的特定字符串(SQL)

sql - 如何将 Snowflake 中的 PROCEDURE_DEFINITION 访问权限从 ADMIN 角色授予另一个角色?

mysql - 更改字符串(文本到列函数)

sql - 雪花: Conversion error of an teradata query to snow sql

sql-server - 使用从阶段文件复制到雪花中插入数据

mysql - mySql 中的简单查询 - 可能是子查询和联接(中级)