2017-06-05 125 views
0

希望我不會使這個變得複雜。 我寫了以下SQL,它返回用戶他們最近的交易符合條件 (TRANS_TYPE NOT IN(4,6,21,23)或DEPOSIT_OPTION > 64)。如果滿足條件,SQL將返回特定類型的最新記錄

SELECT 
TERMINAL_ID,REGISTER_ID,[USER_ID],sub.CREATE_DATE,sub.TRANS_TYPE_ID,BUS_DATE_ID 
FROM (
SELECT 
T.TERMINAL_ID 
,US.REGISTER_ID 
,U.[USER_ID] 
,T.CREATE_DATE 
,T.TRANS_TYPE_ID 
,T.BUS_DATE_ID 
,T.TRANS_CONFIG_ID 
,TT.TRANS_TYPE 
, row_number() 
over (partition by U.[USER_ID] 
order by T.CREATE_DATE desc) rn 
From [RCMDYNAMIC].[dbo].[Transaction] T 
INNER JOIN [RCMDYNAMIC].[dbo].[UserSession] US ON T.USER_SESSION_ID = US.USER_SESSION_ID 
INNER JOIN [RCMSTATIC].[dbo].[User] U ON U.[USER_ID] = US.[USER_ID] 
INNER JOIN [RCMSTATIC].[dbo].[TransactionType] TT ON T.TRANS_TYPE_ID = TT.TRANS_TYPE_ID 
INNER JOIN [RCMSTATIC].[dbo].[Register] R ON US.REGISTER_ID = R.REGISTER_ID 
) sub 
LEFT JOIN 
[RCMSTATIC].[dbo].[DepositConfig] DC 
ON sub.TRANS_CONFIG_ID = DC.DEPOSIT_ID 
WHERE sub.rn = 1 AND (TRANS_TYPE NOT IN (4, 6, 21, 23) OR DEPOSIT_OPTION & 64 <> 64) 

我用

row_number() over (partition by U.[USER_ID] order by T.CREATE_DATE desc) rn

不過,我真正想要的是選擇最近TRANS_TYPE的交易= 10所獲得的「最近交易」如果最近的交易遇到了以前的條件。

前面的代碼中的子查詢將返回所有用戶的所有事務,並按DESC順序對它們進行排名,外部SELECT將通過檢查其級別1事務來顯示符合條件的用戶。

我想是有這樣的事情

FOREACH用戶 如果用戶等級1交易符合條件 THEN 找到用戶最近的TRANS_TYPE 10

交易也可能是交易排名什麼1或等級n

實施例:

User_ID TRANS_TYPE DEPOSIT_OPTION Rank 
    1   4   7   1 
    1   10   7   2 
    2   22   64   1 
    2   23   4   2 
    2   10   126  3 
    2   4   7   4 
    3   10   3   1 
    4   6   64   1 -- doesn't meet the condition 
    4   10   7   2 

形成以前的結果,如果等級1行都滿足

WHERE sub.rn = 1 AND (TRANS_TYPE NOT IN (4, 6, 21, 23) OR DEPOSIT_OPTION & 64 <> 64) 

我想要顯示的,所以我會希望得到的結果是TRANS_TYPE = 10的條件:

User_ID TRANS_TYPE Rank 
    1   10  2 
    2   10  3 
    3   10  1 

我很抱歉,如果問題不是很清楚我盡力了!

+1

增加,因爲這個SQL服務器標籤是SQL服務器語法 –

+2

如何做我們一個忙,並提供了一些數據,並給我們一些具體的「我很期待」值? –

+0

幾乎聽起來像一個'申請'是需要的,而不是一個加入。 – xQbert

回答

0
drop table if exists dbo.Deposits; 

create table dbo.Deposits (
User_ID int 
, Trans_Type int 
, Deposit_Option int 
, Rank int 
); 

insert into dbo.Deposits (User_ID, Trans_Type, Deposit_Option, Rank) 
values (1, 4, 7, 1), (1, 10, 7, 2) 
, (2, 22, 64, 1), (2, 23, 4, 2), (2, 10, 126, 3), (2, 4, 7, 4) 
, (3, 10, 3, 1) 
, (4, 6, 64, 1), (4, 10, 7, 2); 

select 
sub2.User_ID, sub2.Trans_Type, sub2.Rank 
from dbo.Deposits sub 
inner join dbo.Deposits sub2 on sub.User_ID = sub2.User_ID 
     and sub2.Trans_Type = 10 
where sub.Rank = 1 AND (sub.Trans_Type NOT IN (4, 6, 21, 23) OR sub.Deposit_Option & 64 <> 64) 
相關問題