2016-05-10 49 views
1

這是我的第一篇文章,儘管我是日常讀者。 :)帶時差的遞歸查詢

我需要生成一份MS SQL Server 2014報告,顯示在少於或等於3天內回來與我做生意的客戶。我嘗試了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 * 從(選擇噸。*, 最大時動作=「donedeal」和類型=「付費」,那麼日期端(殼體)上 (由用戶從噸 分區,按日期產物順序)last_donedealdate )噸 其中action ='new'和type ='ordered'日期< DATEADD(天,3,last_donedealdate)

UNION ALL

選擇噸。* 從(選擇噸。*, MAX(情況下,當動作= 'donedeal' 和類型= '有序' 然後日期端)上 (由用戶分區,按日期產物順序)last_donedealdate 從噸 )噸 其中action = '新' 和類型= '付費' 日期< DATEADD(天,3,last_donedealdate)

+1

自我內部聯接是一種方法。你嘗試了什麼? (否則你可以嘗試GROUP BY。) – jarlh

+0

@jarlh內部聯接是否有幫助,因爲每一行都需要與其他行和符合條件的類型(類型,datediff,action)進行比較? 我試過GroupBy並比較了MIN(日期)和MAX(日期),但這意味着它只會比較2個結果。有些情況下每行有超過1個匹配。 – ct14

回答

1

您可以爲此使用窗口函數。要獲得最後完成的交易日期,請使用max()partition byorder by。其餘只是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)。所以對我來說只有兩個場景,我複製了代碼,並使用UNION ALL加入了兩個場景的結果。它算作糟糕的練習代碼嗎? – ct14