2017-03-20 6 views
1

データ内で "トランザクション"を見つけて、トランザクションごとにシーケンス番号を生成する必要があります。SQL - OLAP関数

各トランザクションは、check_in = 0 [チェックアウトを意味する]とcheck_in = 1 [チェックインを意味します]を1つのトランザクションとして定義します。その間にはn個のトランザクションがあります。またはcheck_in = 0

同じトランザクション[1トランザクションブロック]のシーケンス番号は同じである必要があります。 Customer_ID、Check_in、Dateのデータがあります。シーケンス番号を生成する必要があります

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」は取引を終了する。それがトランザクションを定義する前にすべてのゼロ。グループの識別は、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; 
+0

"1"は必ずしもトランザクションを終了しません。ビッグ・トランザクション内には、check_inに1と0のすべての組み合わせとNULL値を持つことができるミニ・トランザクションがいくつか存在する可能性があります。 check_in = 0の後にcheck_in = 1を指定すると、トランザクションが終了します。 –

+0

@SreedharReddy。 。 。その場合、シーケンス "2"はなぜ0-0-1の後に開始するのですか?最初の取引を完了するには2つの* 1 *が必要になると思われます。 –

+0

0-0-1はcheck_in = 0で、最初にcheck_in = 1が続き、最初のトランザクションが終了します。 –