我正在尝试编写存储过程。其中一个步骤是检查每个用户的最后一笔交易,并确定它是否满足特定条件。条件是检查最后一笔交易,并决定它是否是我们所称的"最终存款"。
如果事务在我的数据库中只有一行表示,我设法解决了这个问题。但是,有些用户将我们称之为(链式事务)作为他们的最后一个事务,基本上是一个用2或3表示的事务行。如果至少有一个链式交易是最终存款,则整个交易在我的报告中被视为最终存款。
我试图拥有的逻辑是这样的:
`foreach(user in users){
IF (the last transaction is not chained)
THEN
check the last transaction if it's Final Deposit
IF (the last transaction is chained AND with 2 rows/Transactions)
THEN
check the 2nd last transaction that belongs to this transaction if it's Final deposit
IF(the last transaction is chained AND with 3 rows/Transactions )
THEN
check if the 2nd or 3rd last transactions if one of them is final deposit
`
我所做的是使用Row_number()函数完成所有最后一次事务。
SELECT *
FROM
(SELECT T.terminal_id,
US.register_id,
U.[user_id],
U.user_name,
T.create_date,
T.trans_type_id,
T.bus_date_id,
T.trans_config_id,
TT.trans_type,
TT.TRANS_TYPE_NAME,
t.TRANS_NAME,
t.TRANS_ID_CHAINED,
Row_number() OVER (partition BY U.[user_id]
ORDER BY T.create_date DESC) rank
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
WHERE TT.trans_level = 2) sub
WHERE sub.rn = 1 AND ( trans_type NOT IN ( 4, 6, 21, 23 ) OR deposit_option & 64 <> 64 )
从这个查询的结果我可以判断每个用户上次交易是不是最终存款,并从那里继续我的报告逻辑。正如我之前所说,只有在最后一个事务只用一行表示时才有效。我不知道如何使用链式事务(一个事务多行)。
注意:知道事务是否被链接的方式是由列(TRANS_ID_CHAINED)。如果它为0,那么它没有链接,否则它将与它与
链接的交易具有相同的ID类似的东西:
`User_ID TRANS_TYPE trans_config_id TRANS_ID_CHAINED Rank
1 4 7 0 1
1 10 7 0 2
2 22 64 12 1
2 23 4 12 2
2 10 126 12 3
2 4 7 0 4
3 10 3 0 1
4 6 64 13 1
4 10 7 13 2 `
用户1没有链式存款(TRANS_ID_CHAINED为0)所以我只能检查他的Rank 1交易。用户2有一个链式交易,所以我必须检查他的2级和3级交易。用户4还有一个链式交易我必须检查他的等级2.
trans_config_id是配置表的外键我用它来检查事务是否配置为最终存款。
我很抱歉有一个很长但不太清楚的问题。对于这个问题,我只能坚持一周!
:)谢谢
答案 0 :(得分:0)
这样的事对你有用吗?我不清楚以上所有要点所以我给你留下了一些占位符。我在这种情况下选择了CTE,但您可能更喜欢临时表。
步骤:
实施例
WITH sub AS (
[ code above to get table ]
), rank1 AS (
SELECT User_ID, TRANS_ID_CHAINED
FROM sub
WHERE Rank = 1
AND TRANS_ID_CHAINED <> 0
), last_tran AS (
SELECT *
FROM sub
LEFT JOIN rank1
ON sub.User_ID = rank1.User_ID
AND sub.TRANS_ID_CHAINED = rank1.TRANS_ID_CHAINED
WHERE sub.Rank = 1
OR rank1.TRANS_ID_CHAINED is not null
)
SELECT *
FROM last_tran
WHERE [ Final Deposit ]