SAS SQL分层查询

时间:2014-12-09 14:16:53

标签: sql sas hierarchical-data

我正在尝试编写一个sql查询(proc sql)来从示例表中获取数据:

order_id            base_order_id           customer_id
==========================================================
1                       null                            1  //only one transaction
-------------------------------------------------------------------------------
2                       null                            1             //order_start
3                       2                               1
4                       3                               1             
5                       4                               1
6                       5                               1
7                       6                               1             //order_end
-------------------------------------------------------------------------------

如下:

order_id            last_order_id           customer_id 
1                       null                            1                   
2                       7                               1                       

让我这样说吧。 Order_id 2有6个子进程。我们可以假设该客户的​​完整订单包含从2到7的order_id。订单start = order_id 2整个订单在order_id 7结束。

我在sas sql中打招呼。我试过通过左连接加入同一个表,“有”条款,但没有什么效果。 有没有办法得到表2中的查询结果?

提前谢谢。

EDIT2。 我写的SQL,带来了最接近的结果。

SELECT t1.order_id, t1.base_order_id as last_order_id, t1.customer_id

FROM table1 t1

GROUP BY t1.order_id
     HAVING (t1.order_id = max(t1.base_order_id) 
     or t1.base_order_id IS NULL)

2 个答案:

答案 0 :(得分:2)

正如戈登在评论中所说,我想不出在PROC SQL中这样做的方法。

然而,采用“SAS”方式进行连接组件分析。 SAS / OR中的PROC OPTNET就是这样做的。

data have;
input order_id base_order_id customer_id;
datalines;
1 . 1
2 . 1
3 2 1
4 3 1
5 4 1
6 5 1
7 6 1
;
run;

/*Connect the first order to itself*/
data have;
set have;
if base_order_id = . then base_order_id = order_id;
run;

/*Use SAS/OR and connected components*/
proc optnet
    data_links = have(rename=(order_id = to base_order_id = from))
    out_nodes = out;
    concomp;
run;

/*Summarize and add customer id*/
proc sql noprint;
create table want as 
select a.order_id,
       a.last_order_id,
       b.customer_id
    from (
        select min(node) as order_id,
               max(node) as last_order_id
            from out
            group by concomp
    ) as a
      left join
    test as b
      on a.order_id = b.order_id;
quit;

这将返回您在WANT数据集中寻找的内容。

答案 1 :(得分:0)

我所知道的唯一方法是,要求您向要查询的数据添加2个新列。可以在这里找到一个很好的解释:

http://www.sitepoint.com/hierarchical-data-database-2/

我现在没有时间将其转录并将其全部纳入SO答案中。稍后我将使用一些代码修改此答案,这些代码会将2个新列添加到示例数据集中。国际海事组织,无论如何这是最难的部分。

这种方法的一些好处:

  1. 它不是递归的 - 它允许任何SQL查询在一次传递中遍历整个层次结构。
  2. 它支持索引,因此如果您有大量数据,您的查询将运行得更快。
  3. 很容易理解/查询。简单查询可以返回强大的结果。我在复杂的供应链环境中使用这种方法,通过一个简单的SQL查询来识别未来的瓶颈。