我正在尝试编写一个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)
答案 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个新列添加到示例数据集中。国际海事组织,无论如何这是最难的部分。
这种方法的一些好处: