【问题标题】:SQL Server function similar to Posexplode in Hive?SQL Server 功能类似于 Hive 中的 Posexplode?
【发布时间】:2017-12-12 05:22:46
【问题描述】:

我现在正在尝试在 SQL Server 中创建一个进程,该进程已在 Hive 中使用 Posexplode 函数完成。

我有一个大型数据集,如下所示:

    userid     sku                         qty
1   abc        2427022                      3
2   abc        1883575|2427022             1|3
3   def        2427022|1562336|153842      1|1|1
4   ghi        2427022                       3

我希望数据看起来像:

    userid  sku qty
1   abc 2427022 3
2   abc 1883575 1
3   abc 2427022 3
4   def 2427022 1
5   def 1562336 1
6   def 153842  1
7   ghi 2427022 3

谢谢!

【问题讨论】:

  • SO 不是一个教程网站,也不是一群为您工作的人。而是使用您尝试解决问题的代码提出特定问题。另请阅读stackoverflow.com/help/how-to-ask
  • 除了链接之外,您可能还必须将 row_number() 添加到选择中,以便您可以在同一行中的 sku 和 qty 字段中组合正确的值。

标签: sql sql-server key-value data-science


【解决方案1】:

我想通了。如果有人在分隔 2 个分隔列时遇到类似问题,我使用下面的代码来获得所需的输出。我在 SQL Server 中使用 Cross Apply 函数和 XML 来获得与在 Hive 中使用poseexplode函数相同的输出。

--Create test table
create table Table1 (userid varchar(max), Sku varchar(max), Qty varchar(max))
insert Table1 select 'abc', '2427022' , '3'
insert Table1 select 'abc', '1883575|2427022', '1|3'
insert Table1 select 'def', '2427022|1562336|153842' , '1|1|1'
insert Table1 select 'ghi', '2427022' , ' 3'


;WITH CTE1
AS
(
  SELECT RN= Row_Number () over(Order by userid),userid,  
     Split.a.value('.', 'VARCHAR(100)') AS Sku
 FROM  
 (
     SELECT Userid,Sku,  
         CAST ('<M>' + REPLACE(sku, '|', '</M><M>') + '</M>' AS XML) AS Data  
     FROM  Table1
 ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a)
 )
,CTE2 
AS
(
   SELECT RN= Row_Number () over(Order by userid),userid,  
     Split.b.value('.', 'VARCHAR(100)') AS qty
 FROM  
 (
     SELECT Userid,qty,  
         CAST ('<M>' + REPLACE(qty, '|', '</M><M>') + '</M>' AS XML) AS Data  
     FROM  Table1
 ) AS B CROSS APPLY Data.nodes ('/M') AS Split(b)
 )
 Select c.userid, c.Sku, d.qty
 from CTE1 as c
 Inner Join CTE2 as d
 on c.RN =d.RN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 2011-04-22
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    相关资源
    最近更新 更多