SELECT 逻辑创建日期不大于的数据

SELECT Data with logic created date not greater than

我有三个 table 具有如下详细结构和数据:

  1. Table TBL_REFERRAL

    ID     CREATED_DATE           USER_NAME    REFERRAL_CODE
    ---------------------------------------------------------
    1      28-08-2020 12:15:40    DINA         EM0001
    2      28-08-2020 12:19:42    DINA         EM0002
    3      28-08-2020 12:19:22    LISA         EM0003
    4      28-08-2020 20:00:09    LISA         EM0004
    5      29-08-2020 12:00:05    RYAN         EM0004
    
  2. Table TBL_USER

    ID     USER_NAME       UNIQUE_CODE
    ----------------------------------
    1      DINA            UNI0001
    3      LISA            UNI0002
    5      RYAN            UNI0003
    
  3. Table TBL_CHECKOUT

    TRANS_ID      UNIQUE_CODE     CREATED_DATE           ITEM         TOTAL
    ------------------------------------------------------------------------
    1112          UNI0001         28-08-2020 12:20:40    Milk          5000
    1113          UNI0002         28-08-2020 12:22:22    Shampoo      12000
    1114          UNI0002         28-08-2020 20:11:09    Biscuit       5000
    1115          UNI0003         29-08-2020 12:02:05    Soap          2000
    

由于某些情况,在此过程中我无法连接结帐 table 和推荐。但我想有一个视图 table 将结帐与推荐联系起来,但我将其映射到基于在推荐和结帐之间创建的日期时间的逻辑。对我来说可以有这样的视图 table 吗? :

  REFERRAL_CODE  TRANS_ID  USER_NAME  UNIQUE_CODE  REFERRAL_DATE        CHECKOUT_DATE
  ------------------------------------------------------------------------------------------
  EM0002         1112      DINA       UNI0001      28-08-2020 12:19:42  28-08-2020 12:20:40
  EM0003         1113      LISA       UNI0002      28-08-2020 12:19:22  28-08-2020 12:22:22
  EM0004         1114      LISA       UNI0002      28-08-2020 20:00:09  28-08-2020 20:11:09 
  EM0004         1115      RYAN       UNI0003      29-08-2020 12:00:05  29-08-2020 12:02:05

已更新 -> 我一直在尝试这样的查询:

SELECT 
    a.REFERRAL_CODE, a.USER_NAME, b.UNIQUE_CODE, c.TRANS_ID, 
    a.CREATED_DATE AS "REFERRAL_DATE", c.CREATED_DATE AS "CHECKOUT_DATE"
FROM
    TBL_CHECKOUT c
LEFT JOIN TBL_USER b
 ON c.UNIQUE_CODE = b.UNIQUE_CODE
LEFT JOIN TBL_REFERRAL a
 ON a.USER_NAME = b.USER_NAME
WHERE 
    c.CREATED_DATE > a.CREATED_DATE;

结果是:

REFERRAL_CODE  TRANS_ID  USER_NAME  UNIQUE_CODE  REFERRAL_DATE        CHECKOUT_DATE
------------------------------------------------------------------------------------------
  EM0001         1112      DINA       UNI0001      28-08-2020 12:15:40  28-08-2020 12:20:40
  EM0002         1112      DINA       UNI0001      28-08-2020 12:19:42  28-08-2020 12:20:40
  EM0003         1113      LISA       UNI0002      28-08-2020 12:19:22  28-08-2020 12:22:22
  EM0004         1114      LISA       UNI0002      28-08-2020 20:00:09  28-08-2020 20:11:09 
  EM0004         1115      RYAN       UNI0003      29-08-2020 12:00:05  29-08-2020 12:02:05

所以,根据我的结果和预期,仍然缺少 1 个过滤。 在这种情况下 c.CREATED_DATE > a.CREATED_DATE,如果 a.CREATED_DATE 小于 c.CREATED_DATE 则大于 1。数据显示 2 行,它应该只是一个,获取最新的 a.CREATED_DATE。 如果我在逻辑中使用 ROW_NUMBER 它将干扰行 EM0003 & 1113 和 EM0004 & 1114.

根据我目前的结果,我想根据最新的 REFERRAL_DATE 对 transaction_id 进行分组,这可能吗?

非常感谢你的帮助我真的很感激

你可以在这三个表中使用LEFT JOIN,并且需要ROW_NUMBER()解析函数来过滤掉最新CHECKOUT_DATE值中的记录:

WITH t AS
(
SELECT r.REFERRAL_CODE, r.USER_NAME, u.UNIQUE_CODE, c.TRANS_ID, 
       r.CREATED_DATE AS "REFERRAL_DATE", c.CREATED_DATE AS "CHECKOUT_DATE",
       ROW_NUMBER() OVER (PARTITION BY r.USER_NAME ORDER BY c.CREATED_DATE DESC) AS rn
  FROM TBL_CHECKOUT c
  LEFT JOIN TBL_USER u
    ON u.UNIQUE_CODE = c.UNIQUE_CODE 
  LEFT JOIN TBL_REFERRAL r
    ON r.USER_NAME = u.USER_NAME
 WHERE r.CREATED_DATE < c.CREATED_DATE
 )
 SELECT REFERRAL_CODE, USER_NAME, UNIQUE_CODE,TRANS_ID,REFERRAL_DATE,CHECKOUT_DATE
   FROM t
  WHERE rn = 1