SAS SQL 分层查询



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

order_id base_order_id customer_id==========================================================1 空 1//只有一个事务-------------------------------------------------------------------------------2 空 1//order_start3                       2                               14                       3                               1            5                       4                               16                       5                               17 6 1//order_end-------------------------------------------------------------------------------

如下:

order_id last_order_id customer_id1 空 1                  2                       7                               1                      

让我这样说吧。Order_id 2 有 6 个子进程。我们可以假设该客户的完整订单包括 2 到 7 order_id。订单开始 = order_id 2,因为整个订单在 order_id 7 结束。

我是 sas sql 中的乞丐。我尝试通过左连接"拥有"子句连接同一个表,但效果不佳。有没有办法获得表 2 中的查询结果?

提前谢谢你。

编辑2.我写的 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)

因此,正如Gordon在评论中所说,我想不出在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 数据集中查找的内容。

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

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

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

这种方法的一些好处:

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

最新更新