SQL检查事务可能是多行的每个用户的最后一个事务

时间:2017-06-30 16:17:02

标签: sql sql-server stored-procedures

我正在尝试编写存储过程。其中一个步骤是检查每个用户的最后一笔交易,并确定它是否满足特定条件。条件是检查最后一笔交易,并决定它是否是我们所称的"最终存款"。

如果事务在我的数据库中只有一行表示,我设法解决了这个问题。但是,有些用户将我们称之为(链式事务)作为他们的最后一个事务,基本上是一个用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是配置表的外键我用它来检查事务是否配置为最终存款。

我很抱歉有一个很长但不太清楚的问题。对于这个问题,我只能坚持一周!

:)谢谢

1 个答案:

答案 0 :(得分:0)

这样的事对你有用吗?我不清楚以上所有要点所以我给你留下了一些占位符。我在这种情况下选择了CTE,但您可能更喜欢临时表。

步骤:

  1. 上面的表格,称之为子。
  2. 从排名为1的sub获取所有链接的行。
  3. 左连接到sub以从sub返回所有行,其中排名为1或链ID与排名1行匹配。
  4. 从匹配最终存款的结果中获取所有行。
  5. 实施例

    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 ]