如果满足条件,SQL将返回特定类型的最新记录

时间:2017-06-05 16:59:58

标签: sql sql-server

希望我不会让这复杂化。 我编写了以下SQL,它返回用户的最新事务符合条件 (TRANS_TYPE NOT IN(4,6,21,23)或DEPOSIT_OPTION& 64> 64)。

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)

我获得了&#34;最近的交易&#34;使用

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

然而,我真正想要的是选择TRANS_TYPE = 10的最新交易,如果最近的交易符合先前的条件。

上一代码中的子查询将返回所有用户的所有事务,并按DESC顺序对其进行排名,外部SELECT将通过检查他们的Rank 1事务来显示满足条件的用户。

我想要的是拥有这样的东西

FOREACH用户 如果用户排名1交易满足条件 然后 查找用户最近的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 
如果Rank 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 个答案:

答案 0 :(得分: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)