2016-05-10 5 views
1

これは私が毎日の読者ですが、これは私の最初の投稿です。 :)時差のある再帰的クエリ

3日以内に私と一緒に仕事をしてくれるクライアントを示すMS SQL Server 2014レポートを作成する必要があります。私はINNER JOINSで試しましたが、成功しませんでした。私は解決策を考え

の方法は、ロジックの下に使用している:私のデータの

If product is same 
    and if userId is same 
    and if action was donedeal but now is new 
    and if date diff <= 3 days 
    and if type is NOT same 
then show results 

例:

id orderId userId type product date  action 
1 1001 654  ordered apple 01/05/2016 new 
2 1002 889  ordered peach 01/05/2016 new 
3 1001 654  paid apple 01/05/2016 donedeal 
4 1002 889  paid peach 03/05/2016 donedeal 
5 1003 654  ordered apple 03/05/2016 new 
6 1004 889  ordered peach 04/05/2016 new 
7 1005 122  ordered apple 04/05/2016 new 
8 1006 978  ordered peach 04/05/2016 new 
9 1005 122  paid apple 04/05/2016 donedeal 
10 1007 122  ordered apple 10/05/2016 new 

望ましい結果:

id orderId userId type product date  Diff 
3 1001 654  paid apple 01/05/2016 2 days 
4 1002 889  paid peach 03/05/2016 1 day 
5 1003 654  ordered apple 03/05/2016 2 days 
6 1004 889  ordered peach 04/05/2016 1 day 

あなたが直接してくださいでしたがこれを解決するのに役立つ関数に私を教えてください。

ありがとうございます。

更新

ゴードン・リノフは私に、以下の提案のコードを与えたが、種類が異なることがなかったので、私は、コードを複製し、以下のとおりにそれを実行し、それが働いた:

はトンを選択*。 T( Tから last_donedealdateとして ユーザによって(パーティション、日付による製品オーダー)にわたって)を「支払った」日付端を*、 MAX(ケースアクション=「donedeal」Tを選択し、タイプ=)から ここaction = 'new'およびtype = 'ordered'日付< DATEADD(日、3、last_donedealdate)

UNION ALL

選択トン。* からは(トンを選択します。*、 最大アクション= 'donedeal' とタイプ=が '注文'(ケース、日付 トンから last_donedealdateなど、ユーザ、日付による製品のオーダー)による終了) 以上(パーティション)トン アクション= '新しい' とタイプ= '支払わ' 日付< DATEADD(日、3、last_donedealdate)

+1

自己内部結合は1つの方法です。何を試しましたか? (そうでなければ、GROUP BYを試すことができます) – jarlh

+0

@jarlh各行をそれぞれの行と条件(型、日付、アクション)に一致するものと比較する必要があるので、内部結合ヘルプですか? 私はGroupByを試して、MIN(日付)とMAX(日付)を比較しましたが、それは2つの結果の間でのみ比較することを意味します。各行に1つ以上の一致がある場合があります。 – ct14

答えて

1

ますこのためにウィンドウ関数を使用することができます。最終取引日を取得するには、partition byorder byとをmax()と使用してください。残りはちょうどwhere節のロジックです:

select t.* 
from (select t.*, 
      max(case when action = 'donedeal' then date end) over 
       (partition by user, product order by date) as last_donedealdate 
     from t 
    ) t 
where action = 'new' and date < dateadd(day, 3, last_donedealdate); 
+0

私の投稿に反応する時間をとってくれてありがとう、非常に感謝します。私が残したひとつは、タイプが同じであってはならないということです。私の例ではなぜ重要なのかは明らかではないかもしれませんが、それは実際の生活の問題です。私はあなたの解決策を変更しようとしましたが、結果は望ましくありませんでした。私は親切にこれをさらに助けてもらえますか? :) – ct14

+0

@ ct14。 。 。それはそれをより複雑にします。 –

+0

ありがとうございました。マイナーチェンジで私はそれを動作させました。型はブール値フィールド(0または1)です。したがって、2つのシナリオがあり、コードを複製し、2つのシナリオの結果にUNION ALLを使用しました。それは悪い練習のコードとしてカウントされますか? – ct14