【问题标题】:SELECT Data with logic created date not greater than选择逻辑创建日期不超过的数据
【发布时间】:2020-12-18 07:33:37
【问题描述】:

我有三个表,其详细结构和数据如下:

  1. 表 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. 表 TBL_USER

    ID     USER_NAME       UNIQUE_CODE
    ----------------------------------
    1      DINA            UNI0001
    3      LISA            UNI0002
    5      RYAN            UNI0003
    
  3. 表 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
    

由于某些情况,在此过程中我无法连接结帐表和推荐人。但是我想要一个将结帐与推荐连接的视图表,但我使用基于推荐和结帐之间创建的日期时间的逻辑来映射它。我有可能有这样的视图表吗? :

  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更小,那么c.CREATED_DATE大于1。数据显示2行,应该只有1行,获取最新的a.CREATED_DATE。 如果我在逻辑中使用 ROW_NUMBER,它将干扰行 EM0003 & 1113 和 EM0004 & 1114。

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

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

【问题讨论】:

  • 你为什么选择不使用明确的、现代的、标准的、可读的JOIN语法?
  • 您想要来自推荐表的最新记录吗?或者我没听懂。
  • @Sujitmohanty30 有 2 个条件 1。如果 1 个用户名中有 2 个推荐代码然后连接到结帐表,则最新记录表格推荐。 2.需要查看created_date列的checkout表,1个用户名有多少checkout数据,2ndrefer code之前有没有checkout数据。如是。首先将第一个推荐代码连接到第一次结帐,然后将第二个推荐代码连接到下一个结帐。
  • @Diana:感谢您的澄清,但按照这个逻辑,EM0003 如何连接到1113
  • @Sujitmohanty30 好的,所以名为 Lisa 的用户唯一代码是 UNI0002 已在 28-08-2020 12:19:22 获得推荐代码 EM0003(在 TBL_REFERRAL 上)。然后她在 28-08-2020 12:22:22 进行了第一笔交易(onTBL_CHECKOUT 与 unique_code 连接)。然后她在 28-08-2020 20:00:09 获得了第二个推荐码,这意味着第二个推荐码是在她的第一次交易之后出现的。所以,她的第一笔交易应该是与第一个推荐人联系,即 EM0003 到 1113。这种情况是我之前提到的条件号 2。

标签: sql oracle oracle11g oracle12c


【解决方案1】:

你可以在这三个表中使用LEFT JOINROW_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

【讨论】:

  • 好的,实际上我之前已经尝试过您的最后一个查询,没有 ROW_NUMBER()。它已经接近预期的结果,只需要再增加 1 个过滤器。我只需要对 trans id 进行分组并根据推荐表上的最新 created_date 获取。我仍在尝试如何添加这些过滤器我也尝试过添加 ROW_NUMBER 的查询。但是,为什么结果没有显示所有数据仍然令人困惑。我还在检查
  • 这是工作,只是缺少 ROW_NUMBER OVER(PARTITION 应该是 BY USER_NAME 而不是员工代码。这是最后的:
猜你喜欢
  • 2021-04-13
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
相关资源
最近更新 更多