SQL-OLAP函数
我需要在数据中找到“事务”,并为每个事务生成序列号 每个事务被定义为一个check_in=0[表示签出]和check_in=1[表示签入]作为一个事务-这两个事务之间可以有“n”个事务,有些事务的check_in为null或check_in=0 同一事务[一个事务块]的序列号应相同。我有客户ID、登记和日期的数据。需要生成序列号SQL-OLAP函数,sql,sql-server,olap,ranking,row-number,Sql,Sql Server,Olap,Ranking,Row Number,我需要在数据中找到“事务”,并为每个事务生成序列号 每个事务被定义为一个check_in=0[表示签出]和check_in=1[表示签入]作为一个事务-这两个事务之间可以有“n”个事务,有些事务的check_in为null或check_in=0 同一事务[一个事务块]的序列号应相同。我有客户ID、登记和日期的数据。需要生成序列号 Sequence No Customer_ID Check_in Date 1 3252538 0 11/14/1
Sequence No Customer_ID Check_in Date
1 3252538 0 11/14/15 03:20 AM
1 3252538 0 11/14/15 07:37 PM
1 3252538 1 11/15/15 07:27 PM
2 3252538 0 11/17/15 12:34 AM
2 3252538 1 01/27/16 07:46 AM
3 3252538 0 02/01/16 09:09 PM
3 3252538 NULL 02/05/16 08:56 PM
3 3252538 1 02/05/16 11:24 PM
4 3252538 0 02/08/16 07:19 PM
4 3252538 0 02/13/16 02:16 AM
4 3252538 1 02/13/16 10:49 PM
5 3252538 0 02/16/16 06:07 PM
5 3252538 1 02/19/16 03:01 AM
如何在sql中实现这一点?很有趣。“1”结束一个事务。定义事务之前的所有零。您可以通过1的逆和来识别组:
select t.*,
sum(check_in) over (partition by customer_id order by date desc) as grp
from transactions t;
不幸的是,这使事情的顺序相反。因此:
select t.*, dense_rank() over (order by grp) as sequence
from (select t.*,
sum(check_in) over (partition by customer_id order by date desc) as grp
from transactions t
) t;
“1”并不总是结束事务。在一个大事务中可能有一些小事务,这些小事务的签入值可以是1和0以及空值的全部组合。check\u in=0后跟check\u in=1结束事务。@sreedharredy。在这种情况下,为什么序列“2”在0-0-1之后开始?您似乎需要两个*1*s来完成第一个事务。0-0-1是check_in=0,然后是check_in=1,这将结束第一个事务。@sreedharredy。因此“1”结束了交易。是的,当我想到它时,你是对的。我使用的是amazon redshift,它似乎不支持sum(签入),有没有其他方法可以实现这一点?