假设我在Snowflake的原始架构中有这个表:

ID SHIFT TYPE DOW_NUM
0 101 A1 ,2-5,
1 102 A8 1-3,5-6,
2 153 X5 1-3,5-6
2 150 Q9 ,1-3,5-6,
3 567 Q3 ,1-3,5-6
4 345 T6 1-3,5,
5 555 H6H ,1-3,5,
6 353 HU78 ,1-3,5
1 213 B5 1,3-4,7,
23 875 J4 ,1,3-4,7,
23 607 S3 ,1,3-4,7
56 452 A3 ,7,
12 587 ADLS2 ,7
12 839 QWRETY4 7,
13 466 R5 ,
14 743 Y7 ,2,4,6,
14 432 E32 2,4,6
31 117 OP9 2,4,6,
11 109 TRE5 ,2,4,6
20 217 TUYP8 1-6,7

我需要将"DOW_NUM"列转换为NEW_DOW_NUM列,如下所示:

ID SHIFT TYPE DOW_NUM NEW_DOW_NUM
0 101 A1 ,2-5, 2,5
1 102 A8 1-3,5-6, 1,2,3,5,6
2 153 X5 1-3,5-6 1,2,3,5,6
2 150 Q9 ,1-3,5-6, 1,2,3,5,6
3 567 Q3 ,1-3,5-6 1,2,3,5,6
4 345 T6 1-3,5, 1,2,3,5
5 555 H6H ,1-3,5, 1,2,3,5
6 353 HU78 ,1-3,5 1,2,3,5
1 213 B5 1,3-4,7, 1,3,4,7
23 875 J4 ,1,3-4,7, 1,3,4,7
23 607 S3 ,1,3-4,7 1,3,4,7
56 452 A3 ,7, 7
12 587 ADLS2 ,7 7
12 839 QWRETY4 7, 7
13 466 R5 ,
14 743 Y7 ,2,4,6, 2,4,6
14 432 E32 2,4,6 2,4,6
31 117 OP9 2,4,6, 2,4,6
11 109 TRE5 ,2,4,6 2,4,6
20 217 TUYP8 1-6,7 1,2,3,4,5,6,7

我如何在snowflake中做到这一点?"DOW_NUM"列将始终具有分别为1和7的最小和最大数值,因为这些数字表示一周中的日期,问题是某些值具有不同组合的连字符和逗号.

我发布这个问题是因为这是我在自己的工作中必须解决的问题,我已经有了答案,但我发布它是为了帮助Stack Overflow社区,以防有人遇到类似的问题.如果你有比我发布的更好的解决方案,请分享它,这样我就可以了解其他获得最终结果的方法.

推荐答案

使用array_generate_rangesplit_to_table函数try 以下操作:

WITH T AS (
SELECT 
  TB.ID, 
  TB.SHIFT, 
  TB.TYPE, 
  TB.DOW_NUM,
  NULLIF(SP.VALUE, '') AS COMMA_SPLIT_VAL
FROM TBL_NAME TB, 
LATERAL SPLIT_TO_TABLE(TB.DOW_NUM, ',') SP
) 
SELECT 
  T.ID, 
  T.SHIFT, 
  T.TYPE, 
  T.DOW_NUM, 
  LISTAGG(GR.VALUE, ', ') WITHIN GROUP (ORDER BY GR.VALUE) NEW_DOW_NUM
FROM T, 
TABLE(
   FLATTEN(
           ARRAY_GENERATE_RANGE(SPLIT_PART(T.COMMA_SPLIT_VAL, '-', 1), 
           COALESCE(NULLIF(SPLIT_PART(T.COMMA_SPLIT_VAL, '-', 2), ''),
           SPLIT_PART(T.COMMA_SPLIT_VAL, '-', 1)) +1, 1),  
           OUTER => TRUE
          )
      ) GR
GROUP BY T.ID, T.SHIFT, T.TYPE, T.DOW_NUM
ORDER BY T.ID, T.SHIFT, T.TYPE;

输出示例:

ID  SHIFT   TYPE    DOW_NUM       NEW_DOW_NUM
0   101     A1      ,2-5,         2, 3, 4, 5
1   102     A8      1-3,5-6,      1, 2, 3, 5, 6
1   213     B5      1,3-4,7,      1, 3, 4, 7
2   150     Q9      ,1-3,5-6,     1, 2, 3, 5, 6
2   153     X5      1-3,5-6       1, 2, 3, 5, 6
3   567     Q3      ,1-3,5-6      1, 2, 3, 5, 6
4   345     T6      1-3,5,        1, 2, 3, 5
5   555     H6H     ,1-3,5,       1, 2, 3, 5
6   353     HU78    ,1-3,5        1, 2, 3, 5
12  839     QWRETY4 7,            7
13  466     R5       ,  

Sql相关问答推荐

从以前的非空值行中获取值

从原始表列中经过JSON字符串化的对象数组构建视图

基于多列比较连接两个表

导出部分条形码字符串GS1-128

对表进行多项 Select 以返回最大值和时间

使用多个嵌套数组查询JSON数据

基于是否具有某些数据的关联表覆盖SELECT语句中的列值

属于(日期)范围类型及其交集的总权重​

MS Access问题查询中的自定义字段

在Power Bi中将SQL代码转换为DAX

根据具有特定值的 ID 创建自定义组

删除对 JSON 数据的未解析引用的 SQL71502 警告

返回给定日期后的第 4 个工作日(不包括公众假期)

根据要过滤的列的值进行联接和分组

基于字符串的SQL查询

当该日期的至少两条记录具有相同的持续时间或至少一条记录的持续时间为 0 时,如何标记该日期的所有记录

使用 R 遍历 SQL 查询,每次替换一个变量

SQL查询以获取从特定可变日期看到的用户

来自 SQL Server 的树层次 struct 图的 JSON

SQL中所有先前日期的累计总和