首页 > 解决方案 > 在 Teradata 中使用资格和日期条件连接数据

问题描述

我对包含超过 50MM 记录的数据集有一个数据请求,以根据日期和时间戳添加一些数据字段

  Dataset that I have

  ID    CODE    ISSUEDATE       ISSUETIME     ORDERDATE    ORDERTIME       QTY
  101   A51     2020-08-24      11:24:00      2020-08-21   09:25:00       100
  101   777     2020-08-21      08:30:00      2020-08-21   08:30:00       125
  101   888     2020-08-21      09:30:00      2020-08-21   09:30:00       145
  102   A51     2020-08-23      11:24:00      2020-08-21   09:25:00       100
  102   256     2020-08-20      08:30:00      2020-08-20   08:30:00       125
  102   256     2020-08-20      11:24:00      2020-08-20   11:24:00       145

我需要提取 CODE='A51' 的数据

 I want the following Dataset

  ID    CODE    ISSUEDATE       ISSUETIME     ORDERDATE    QTY   ISSUEDATE2  ISSUUTIME2   QTY2
  101   A51     2020-08-24      11:24:00      2020-08-21   100    2020-08-21  08:30:00    125
  102   A51     2020-08-23      11:24:00      2020-08-21   100    2020-08-20  08:30:00    125
  1. 我需要根据每个 ID 的代码值“A51”的 ORDERDATE 和 ISSUETIME 创建 ORDERDATE2、ISSUETIME2 和 QTY2 变量。

  2. ORDERDATE2 和 ORDERTIME2 将查找 ORDERDATE 和 ORDERTIME 并从非“A51”行中提取最接近的 ISSUEDATE 和 ISSUETIME 以及 QTY 详细信息

在上面的示例中 - ID 101 的 ORDERDATE 为 '2020-08-21' 和 ORDERTIME 为 09:25 - 因此,此 ID 在 2020-08-21 上最近的非'A51' 记录是 08:30:00,数量为 125

  1. 如果没有 ORDERDATE 条目,则应捕获最近的 ISSUEDATE 在上面的示例中 - ID 102 的 ORDERDATE 为“2020-08-21”,但没有“2020-08-21”的 ISSUEDATE 行,因此最接近到这个日期是('2020-08-20'、08:30:00 和 125)捕获的。

我是 TeradataQualify语句的新手,我所做的只是为 A51 而不是 A51 创建单独的数据集,并在 ID 和时间上加入它们

    Create table _A51_ as Select ID, ISSUEDATE, ISSUETIME, ORDERDATE, ORDERTIME, QTY from
    Have where CODE='A51'

    Create table _Non_A51_ as Select ID, ISSUEDATE, ISSUETIME, ORDERDATE, ORDERTIME, QTY from
    Have where CODE ne 'A51'

    Create table _A51B_ as Select 
     A.*,B.ISSUEDATE as ISSUEDATE2, B.ISSUETIME as ISSUETIME2
     from _A51_ as A
     inner join _Non_A51_  as B
     where A.ID=B.ID and 
     A.ORDERDATE=B.ISSUEDATE
     and A.ORDERTIME le B.ISSUETIME
    QUALIFY ROW_NUMBER() OVER (PARTITION BY A.ID, A.ISSUEDATE ORDER BY B.ISSUETIME)=1

这不会给我 ID 102 的行 - 我希望应该有一种简单的方法,而无需我创建两个数据集并将它们重新连接起来。

非常感谢这里的任何帮助。

标签: joinsql-order-byteradatarow-numberteradata-sql-assistant

解决方案


推荐阅读