【问题标题】:SAS SQL hierarchic querySAS SQL 分层查询
【发布时间】:2014-12-10 00:51:00
【问题描述】:

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

order_id base_order_id customer_id ==================================================== ======== 1 null 1 //只有一笔交易 -------------------------------------------------- ----------------------------------------- 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 无 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)

【问题讨论】:

  • 我不知道使用 SQL proc SQL 的方法。但是,您可以在底层数据库中使用递归/分层功能来执行此操作。或者,通过使用 SAS 系统中的其他功能。
  • 你能解释一下last_order_id是如何计算的吗?从这个例子中我并不完全清楚。
  • @JJFord3 我已经编辑了我的帖子。希望你现在更清楚了。
  • 到目前为止你有什么 sql?你试过什么?
  • @GordonLinoff Gordon - 我知道你喜欢你的 SQL,所以请查看下面我的答案中的链接。附带说明一下,几年前我在拉斯维加斯与你自己和戴夫一起使用 EMiner 进行了数据挖掘的介绍。我上过的最好的课程 =)

标签: sql sas hierarchical-data


【解决方案1】:

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

【讨论】:

  • 非常感谢。不幸的是,我的公司没有为我提供 SAS/OR。我只有 SAS EG6.1。因此,我将不得不独自完成这项任务。谢谢。
  • EG 只是您的 IDE。 SAS/OR 是一个获得许可的组件,就像 SAS/STAT 或 SAS/GRAPH 一样。您可能没有获得许可。试一试,如果你没有找到“PROC OPTNET”,那么你就没有它。然后,您需要在数据步骤中滚动您自己的组件分析。
  • 谢谢。正如你所说...我已经运行了 PROC OPTNET,但它给出了一个错误 - 未获得许可。
【解决方案2】:

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

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

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

这种方法的一些好处:

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

【讨论】:

  • 谢谢。期待您的回复。
猜你喜欢
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 2015-10-26
  • 1970-01-01
相关资源
最近更新 更多