Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-OLAP函数_Sql_Sql Server_Olap_Ranking_Row Number - Fatal编程技术网

SQL-OLAP函数

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

我需要在数据中找到“事务”,并为每个事务生成序列号

每个事务被定义为一个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/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(签入),有没有其他方法可以实现这一点?