【问题标题】:SQL - Left Join return latest recordSQL - 左连接返回最新记录
【发布时间】:2019-07-14 01:57:38
【问题描述】:

我当前的代码是:

SELECT
T1.SC,
T2.ACC,
T3.C_IDENT,
T4.TITLE,
T4.MID,
T4.SUR
FROM D_REG.AR_JOINT T1

LEFT JOIN E_BASE.ACC_TRANS T2
ON T1.SC = T2.SC
AND T1.ACC = T2.ACC
AND T2.IDENTIFEIR_END_DATE ='3000-12-31'

LEFT JOIN E_BASE.B_HOLDING T3
ON T2.M_IDENT = T3.C_IDENT
AND T3.EFF_END_DATE ='3000-12-31'
AND T3.P_HOLDING_END+DATE ='3000-12-31'

LEFT JOIN E_BASE.PNAM T4
ON T3.C_IDENT = T4.C_IDR
AND T4.EFF_END_DATE ='3000-12-31'

目前,如果 End Dates = ‘3000-12-31’,代码状态将返回结果。 但是,如果对表中的任何列进行任何修改,它将为该记录创建一个重复的行。原始记录的结束日期为修改日期,而新记录的结束日期为“3000-12-31”。

然后我的代码将只带回活动记录。如果记录不再有效,它将有一个结束日期,例如“2018-10-15”,因此返回? ? ? ? T4 的值。

如何修改代码以恢复具有最新结束日期的记录?

【问题讨论】:

    标签: sql date left-join teradata record


    【解决方案1】:

    对于 Teradata,您可以使用 Qualify 来限制 ODAP 函数,在这种情况下为 ROW_NUMBER()。如果不了解您的数据,您无法完全回答您的问题。但基本上,添加到您的查询中

    QUALIFY ROW_NUMBER() OVER (PARTITION BY <YOUR KEY COLUMN(S) ORDER BY  T4.EFF_END_DT DESC) = 1
    

    这将为您提供每个“键”的最新行(基于您的列 eff_end_dt)。

    【讨论】:

    • 感谢您的回复-我之前尝试过此操作,但在不同的结束日期之前进行了订购,但是,它仅从我正在寻找结果的 3887 个帐户中带回 2187 个结果...
    • 抱歉,没有捕捉到外连接。如果不是驱动程序表中的所有行在您要从中获取生效日期的表中都有相应的行,您可能需要使用合并日期 - 类似于order by coalesce(t4.eff_end_dt,'9999-12-31') DESC。也不确定我是否为生效日期选择了正确的表格。
    • 谢谢安德鲁!我的愚蠢错误......我没有从原始代码中删除结束日期=。删除它并使用您最初的建议再次运行,它很有魅力?
    猜你喜欢
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2020-05-22
    • 1970-01-01
    • 2016-07-28
    相关资源
    最近更新 更多