2016-10-08 6 views
3

私は、SQL Server 2012を使用していますし、私のデータは次のようになります。SQLに複数の制約がある場合、同じ値を持つ連続した行数を見つける方法はありますか?

ActivityID ActivityCode Name_of_User ActivityCode_PrevActivity isLastActivityByUserSame 
1020  B1    ABE    A2       0 
1021  A2    BOB    A1       0 
1022  A2    BOB    A2       1 
1023  B1    ABE    B1       1 
1024  B1    ABE    B1       1 
1025  B2    ABE    B1       0 
1026  B2    CARL   A3       0 
1027  A1    CARL   B2       0 
1028  B8    BOB    A2       0 
1029  A1    CARL   A1       1 
1030  B2    ABE    B2       1 
1031  B4    ABE    B2       0 
1032  B8    BOB    B8       1 
1033  A3    BOB    B8       0 
1034  B4    CARL   A1       0 

ただ、フィールドが何を表しているかの簡単な概要として:

  • のActivityID:テーブルのPK
  • アクティビティコード:ユーザのアクティビティのタイプ
  • 名前_of_user:ユーザーの名前
  • ActivityCode_PrevActivity:ユーザによる最後のアクティビティのアクティビティコード
  • isLastActivityByUserSame:ユーザによる最後のアクティビティコードが現在のアクティビティコードと同じであるかどうかを示すのバイナリ値

これ以外にも、手元にあるタスクに役立たない可能性がある他の列がいくつかあります。

Name_of_Userによって、各行に同じ値を持つ連続する行の数の実行カウントを生成したいとします。あなたはそれがどのように見えるかのアイデアを与えるために、ここで意図した結果(新しいConsecActivityCount列に注目してください)です、

Select *, 
DENSE_RANK() OVER (PARTITION BY Name_of_User ORDER BY ActivityID) as ConsecReports 
FROM ActivityTable 

しかし:

ActivityID ActivityCode Name_of_User ActivityCode_PrevActivity isLastActivityByUserSame ConsecActivityCount 
1020  B1    ABE    A2       0       0 
1023  B1    ABE    B1       1       1 
1024  B1    ABE    B1       1       2 
1025  B2    ABE    B1       0       0 
1030  B2    ABE    B2       1       1 
1031  B4    ABE    B2       0       0 
1021  A2    BOB    A1       0       0 
1022  A2    BOB    A2       1       1 
1028  B8    BOB    A2       0       0 
1032  B8    BOB    B8       1       1 
1033  A3    BOB    B8       0       0 
1026  B2    CARL   A3       0       0 
1027  A1    CARL   B2       0       0 
1029  A1    CARL   A1       1       1 
1034  B4    CARL   A1       0       0 

は、私のようなものを使用しようとしました私は運がない。

このような列を計算する最も良い方法は何ですか?

ありがとうございます!

答えて

0

私は良い解決策を見つけたと思います。最初に出現した配列のIDを作成してから、連続する正の 'isLastActivityByUserSame'の数を数えました。ここで

は、ソリューションです:クエリ以下

SELECT at.*, 
    (CASE WHEN at.isLastActivityByUserSame != 0 
     THEN SUM(CASE WHEN at.isLastActivityByUserSame != 0 THEN at.isLastActivityByUserSame END) OVER (PARTITION BY Name_of_User, LastSequenceID ORDER BY ActivityID) 
    ELSE 0 END) AS ConsecActivityCount 
FROM (select at.*, 
     SUM(CASE WHEN isLastActivityByUserSame != 0 THEN 0 ELSE 1 END) OVER (ORDER BY ActivityID) AS LastSequenceID 
    FROM ActivityTable at 
) at ORDER BY Name_of_User, ActivityID; 
0

使用。それが動作します。

SELECT * 
     ,ROW_NUMBER()OVER(PARTITION BY Name_of_User, ActivityCode ORDER BY ActivityID)-1 AS ConsecActivityCount 
FROM ActivityTable 

enter image description here

+0

アジャイは、このクエリはName_of_UserとActivityCodeでアップデータを分割します。ただし、isLastActivityByUserSameフィールドに '0'が見つかるたびに連続カウントを保持し、カウントを '0'にリセットすることはうまくいきません。あなたのスクリーンショットに記載されているように、この限られたケースでは動作するようですが、大きなサンプルで手動でカウントを行った後、これはオフです –

関連する問題