如何分别在每个组的记录之间创建笛卡尔积?

时间:2015-03-31 10:58:51

标签: sql sas

假设我销售的服务跨越一段时间(几天,几个月甚至几年)。我有一个产品表,其中列出了每个产品,以及Customer_IDService_start以及Service_end日期。

现在我想在每个客户中列出所有对(Service_startService_end)的组合;例如(按Customer_ID排序的表)

Lp  Service_start  Service_end  Customer_ID
--------------------------------------------
1     2-Feb-2014    8-Aug-2014   1
2     5-May-2014   20-Dec-2014   1
3     7-Jul-2014    9-Sep-2014   1
4    13-Jan-2014   13-Jan-2015   2
..      ...              ...     ...

我想变成

Lp  Service_start  Service_end  Customer_ID
--------------------------------------------
1     2-Feb-2014    8-Aug-2014   1
2     2-Feb-2014   20-Dec-2014   1
3     2-Feb-2014    9-Sep-2014   1
4     5-May-2014    8-Aug-2014   1
5     5-May-2014   20-Dec-2014   1
6     5-May-2014    9-Sep-2014   1
7    13-Jan-2014    8-Aug-2014   1
8    13-Jan-2014   20-Dec-2014   1
9    13-Jan-2014    9-Sep-2014   1
10   13-Jan-2014   13-Jan-2015   2
...     ...               ...   ...

表格足够大,不适合记忆。

SQL如何实现?还是SAS?

1 个答案:

答案 0 :(得分:2)

您可以在SAS和SQL中执行此操作。这是SQL的想法:

select ss.service_start, se.service_end, ss.customer_id
from (select distinct customer_id, service_start from table) ss join
     (select distinct customer_id service_end from table) se
     on ss.customer_id = se.customer_id;

这与SAS proc sql兼容。

在大多数SQL方言中,您可以使用lp添加row_number() over (order by customer_id, service_start, service_end)列。在SAS中,您可以使用monotonic()proc sql之后的数据步骤。