繁体   English   中英

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

[英]SQL return the most recent record of a specific type if a condition is met

希望我不要把这个复杂化。 我写了下面的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)

我通过使用获取了“最近的交易”

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

但是,我真正想要的是如果最近的事务满足先前条件,则选择最近的事务TRANS_TYPE = 10。

前面代码中的子查询将返回所有用户的所有交易,并按DESC顺序对它们进行排名,外部SELECT将通过检查其排名1的交易来显示满足条件的用户。

我想要的是这样的东西

如果用户等级1的交易满足条件,则FOREACH用户,然后查找用户最近一次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

如果问题不是很清楚,我很抱歉,我已尽力了!

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM