SELECT 逻辑创建日期不大于的数据
SELECT Data with logic created date not greater than
我有三个 table 具有如下详细结构和数据:
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
Table TBL_USER
ID USER_NAME UNIQUE_CODE
----------------------------------
1 DINA UNI0001
3 LISA UNI0002
5 RYAN UNI0003
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
我有三个 table 具有如下详细结构和数据:
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
Table TBL_USER
ID USER_NAME UNIQUE_CODE ---------------------------------- 1 DINA UNI0001 3 LISA UNI0002 5 RYAN UNI0003
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