SQL组基于单个行链接到另一个单独的行

时间:2018-02-19 21:34:56

标签: sql sql-server grouping sql-server-2014

我不太清楚如何更好地提出这个问题。实际上我有一个交易表。每个客户的此表具有针对该客户的1到多行事务。每行,它标记在之前发生的先前客户的客户ID。例如:

Cust_ID   Tran_Type   Prev_ID
10        A           9
10        B           9
9         T           7
9         A           7
8         B           ~
8         A           ~
7         T           ~

在此示例中,cust 7是使用此程序的个人当天的起始客户。然后他们开始为客户9工作,然后最终客户10工作。此外,对于另一个人,他们从客户8开始,并且一整天都没有做另一笔交易。我预期的两个组是A组,它由客户7,9,10组成,B组仅由客户8组成。

老实说,我真的很难过。有人有建议吗?我非常肯定我想首先对独特的客户ID和以前的ID进行分组,这些ID会给我:

Cust_ID   Prev_ID
10        9
9         7
8         ~
7         ~

此时虽然我不确定如何使用vanilla sql做到这一点。感谢。

2 个答案:

答案 0 :(得分:0)

应该是group by

select 
  custid, prev_id
from transactiontable
group by custid,previd

答案 1 :(得分:0)

你是对的,你从不同的行开始。然后递归地从记录中上升而没有先前的交易。

with pairs as
(
  select distinct cust_id, prev_id from transactions
)
, groups (cust_id, prev_id, grp, pos) as
(
  select cust_id, prev_id, row_number() over (order by cust_id), 1
  from pairs
  where prev_id is null
  union all
  select p.cust_id, p.prev_id, g.grp, g.pos + 1
  from pairs p
  join groups g on g.cust_id = p.prev_id
)
select cust_id, prev_id, grp
from groups
order by grp, pos;

REXTESTER演示:http://rextester.com/NZGLU84962