【问题标题】:Teradata Qualify Function Not Working CorrectlyTeradata Qualify 功能无法正常工作
【发布时间】:2018-05-05 11:03:34
【问题描述】:

简单地说,我有一个看起来像...的表。

ID   |  Start_Date      
1234 |  9/1/2017    

表 b 的付款日期和金额与表 a 中的 ID 对应。表 b 看起来像..

ID   |  Recd_Date  |  Tran_Code  | Total_Recd  
1234 |  10/2/2017  |    173      | $100
1234 |  11/1/2017  |    173      | $200

我正在尝试使用 Qualify 函数来显示在表 a 的 Start_Date 之后发生的表 b 中的第一个 recd_date 和数量。到目前为止,我有以下代码。该代码有效,但由于某种原因,它显示了 2017 年 11 月 1 日。

SELECT 
a.ID,
a.Start_Date,
b.Recd_Dt,
b.Total_Recd,
b.Tran_ID
FROM
(SELECT ID, START_DATE FROM tbl) a
LEFT JOIN 
(SELECT ID, Recd_Dt, tran_ID, Total_Recd
FROM tbl b
WHERE Tran_ID = '173' AND Total_Recd > 0
QUALIFY ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Recd_Dt)=1
)b
ON a.ID = b.ID AND b.Recd_Dt >= a.Start_Date

Where a.ID = '1234'

代码运行,但由于某种原因,我显示 b 表列的空值。如果我将 Qualify 行更改为..

QUALIFY ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Recd_Dt ASC)=1

我仍然得到一个空值,如果我将其更改为 DESC 订单,我会得到 11/1/2017 条目。

我需要做什么才能获得 10/2/2017 线路?

【问题讨论】:

  • 您使用的是LEFT JOIN,您确定在b 中获得NULLs 的情况有任何 个匹配记录吗? (请注意,连接谓词b.Recd_Dt >= a.Start_Date ROW_NUMBER() 限定条件之后应用...)
  • 您能否详细说明两个表中的行数和每个 ID 的行数?并回答您上一篇文章中的问题:是否可以在表 a 中为相同的 ID 添加其他行?如果是,如何处理?

标签: sql teradata


【解决方案1】:

您正在应用QUALIFY 之前 LEFT JOIN。这意味着您在表中找到一个记录(根据id,然后将其加入a

应用QUALIFY 之后 LEFT JOIN...

SELECT 
    a.ID,
    a.Start_Date,
    b.Recd_Dt,
    b.Total_Recd,
    b.Tran_ID
FROM
(
    SELECT ID, START_DATE FROM tbl
)
    a
LEFT JOIN 
(
    SELECT ID, Recd_Dt, tran_ID, Total_Recd
    FROM tbl b
    WHERE Tran_ID = '173' AND Total_Recd > 0
)
    b
        ON  b.ID       = a.ID
        AND b.Recd_Dt >= a.Start_Date
WHERE
    a.ID = '1234'
QUALIFY
    ROW_NUMBER() OVER(PARTITION BY a.ID ORDER BY b.Recd_Dt) = 1

【讨论】:

  • 谢谢这是完美的。我想这是我在做的愚蠢的事情。是否可以添加第三个表并使用限定功能?假设表 c 包含相同的字段,我只需要显示第一条记录 c.Recd_Dt >= a.Start_Date。有这种可能吗?
  • ROW_NUMBER() OVER(PARTITION BY a.ID ORDER BY b.Recd_Dt, c.Recd_Dt) = 1
  • 但要小心,第一次加入>= 会将“x”记录加入a 中的每条记录,然后再加入另一个>= 会将“y”记录加入每条记录在b 中,然后将其全部过滤到a 中的每条记录一条记录。如果您只过滤少量,那没关系。但是,如果连接有 1000 个匹配项,然后过滤为一个,那么您对 ​​c 的介绍会使 1000 * 1000 = 1,000,000... 相反,只需将其全部嵌套。 SELECT blah FROM (your query with one QUALIFY already) LEFT JOIN blah QUALIFY blah
  • 如果您想在 absolute detail 中准确地解释数据的结构,您可以使用 LEAD() 来做到这一点,而不是使用加入。但是,如果不了解复杂的细节数据的结构,我将无法帮助您。
  • 哇,非常感谢,我没有意识到您可以在限定语句中添加多个表。这解决了我的很多问题!
猜你喜欢
  • 2017-09-23
  • 2013-11-06
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多