在 Snowflake 中使用横向展平逻辑

Using lateral flatten logic in Snowflake

我有一个名为 table_1 的 table。它包含一个名为 ITEM_LIST 的列,其中包含以下值:

;;;;;103=::info::0|112=::info::0|114=::info::0|170=::info::0|1237=::info::0|1293=::info::0
;;;;;103=::info::0|112=::info::0|114=::info::0|170=::info::0|1237=::info::0|1293=::info::0

SELECT X.value::string AS purchase_list
   FROM table_1 a,
   LATERAL flatten
   (INPUT=>split(a.ITEM_LIST, '|')) X 
   limit 100

当我 运行 上述 SQL 查询时,我得到如下所述的结果:

ITEM_LIST
;;;;;103=::info::0
;;;;;103=::info::0

我没有得到“|”后的值符号

我需要显示第二条记录的索引值

当我 运行 下面的示例查询时,我正在获取记录。但是当我用原始 table 替换双 table 时,我没有得到正确的结果。

SELECT index,d.value::string AS purchase_list 
              FROM (
                        SELECT c.value::string AS purchase_list
                          FROM DUAL,LATERAL flatten(INPUT=>split(';960137161;10;9.49;20339=1.49|20340=1.00|20342=4.90|20341=0.95|20345=0.51;103=::info::0|112=::info::0|114=::info::0|170=available|1226=006-Employee Savings|1227=Associate Discount|1237=::info::0|1293=::info::0,;125300189;3;3.57;20339=4.49|20340=3.49|20342=3.00|20341=1.19|20343=6.72|20345=0.18;103=justforu|112=no-value|114=justforu:offer-details#product-grid#non-search#not-recommended#r02#s05|170=available|1226=003-001 EVoucher (elec)#009-PaperVoucher|1227=4 for .00#Salesperson Discount|1237=::info::0|1293=::info::0,;125300057;3;3.57;20339=4.49|20340=3.49|20342=3.00|20341=1.19|20343=6.72|20345=0.18;103=justforu|112=no-value|114=justforu:offer-details#product-grid#non-search#not-recommended#r06#s22|170=available|1226=003-J4U Store eCoupons (elec)#006-Employee Savings|1227=4 for .00#Salesperson Discount|1237=::info::0|1293=::info::0,;960113015;1;8.54;20339=9.99|20340=8.99|20342=1.00|20341=8.54|20345=0.45;103=search-results|112=no-value|114=search-results#product-grid#nutella#not-recommended#r01#s01|170=available|1293=::info::0,;970104604;1;5.21;20339=5.99|20340=5.49|20342=0.50|20341=5.21|20345=0.28;103=home|112=no-value|114=home#buy it again#non-search#past-purchase#r01#s06|170=available|1226=006-Salesperson promo|1237=::info::0|1293=::info::0', '|')) c 
                      ), LATERAL flatten(INPUT=>split(purchase_list, ';')) d
                      
SELECT X.value::string AS purchase_list
   FROM (
    SELECT ';;;;;103=::info::0|112=::info::0|114=::info::0|170=::info::0|1237=::info::0|1293=::info::0' as item_list
   ) a,
   LATERAL flatten
   (INPUT=>split(a.ITEM_LIST, '|')) X 
   limit 100

有效。

PURCHASE_LIST
;;;;;103=::info::0
112=::info::0
114=::info::0
170=::info::0
1237=::info::0
1293=::info::0

所以我要大胆猜测,假设你的 limit 100 是 return 只是前 100 行,你看不到后面的任何部分,因为它们被删除了极限??

第二次猜测:

当您只有一行输入并将其拆分时,您会看到该行的 N 行输出。

但是当你有两个拆分,并从 table 读取时,有数百个 table 行,并且两个拆分产生很多行。

所以你添加了一个限制 100,但它限制了最终输出..

所以如果我们限制原来的 table,通过 sub-select

SELECT X.value::string AS purchase_list
   FROM table_1 a,
   LATERAL flatten
   (INPUT=>split(a.ITEM_LIST, '|')) X 
   limit 100

前往:

SELECT X.value::string AS purchase_list
   FROM (
       SELECT * 
       FROM table_1 
       LIMIT 2 -- one 1 even
   ) AS a,
   LATERAL flatten
   (INPUT=>split(a.ITEM_LIST, '|')) X 
   --limit 100

那么您将只会看到一个 table 行的管道拆分,然后您还可以进行 semi-colon 拆分。

昨天我没有看到“为什么 prod 代码需要 100 的限制”,但如果我连接点,你将从第二个展平中输出索引。看起来您正在尝试检查 semi-colon 拆分“获取第二个值的规则”是否为真,或者您已经隔离了不同的边缘情况,因此正在尝试缩小这种情况。又名数据工程,这个问题哪一点有意义。