【问题标题】:Using a stored procedure in Teradata to build a summarial history table使用 Teradata 中的存储过程构建汇总历史表
【发布时间】:2018-05-12 11:31:06
【问题描述】:

我正在使用连接到企业 DW 的 Terdata SQL 助手。我编写了下面的查询,以显示截至特定时间点的未清项目清单。引用的表在加载日期对其状态进行更改时加载和存储新记录(并且不删除历史记录)。我的查询的输出是指定日期的 1 行。我可以创建某种存储过程或递归查询来构建这些摘要行的历史记录(每天有 1 个新行)吗?我过去没有使用过这样的功能;如果适用,可以链接到以前回答的有关我如何在研究其他可能的解决方案方面走上正轨的问题或建议的链接;只是试图弥合我的知识差距。

SELECT
'2017-10-02' as Dt
,COUNT(DISTINCT A.RECORD_NBR) as Pending_Records 
,SUM(A.PAY_AMT) AS Total_Pending_Payments
FROM DB.RECORD_HISTORY A 

INNER JOIN
(SELECT MAX(LOAD_DT) AS LOAD_DT
,RECORD_NBR
FROM DB.RECORD_HISTORY
WHERE  LOAD_DT <= '2017-10-02' 
GROUP BY RECORD_NBR
) B 

ON A.RECORD_NBR = B.RECORD_NBR
AND A.LOAD_DT = B.LOAD_DT
WHERE 
A.RECORD_ORDER =1 AND Final_DT Is  Null   
GROUP BY Dt
ORDER BY 1 desc

【问题讨论】:

    标签: sql stored-procedures teradata


    【解决方案1】:

    这是我对您的查询的解释:

    对于 record_order #1 的最新 load_dt(截至 2017 年 10 月 2 日), 返回

    1) 不同待处理记录的数量
    2) 待付款总额

    这是正确的吗?如果您正在查找此信息,但每个“Load_Dt”只有一行,则只需删除该 INNER JOIN:

    SELECT 
        load_Dt,
        COUNT(DISTINCT record_nbr) AS Pending_Records,
        SUM(pay_amt) AS Total_Pending_Payments
    FROM DB.record_history
    WHERE record_order = 1
    AND final_Dt IS NULL
    GROUP BY load_Dt
    ORDER BY 1 DESC
    

    如果您想获取每个 record_order 的摘要信息,只需将 record_order 添加为分组列:

    SELECT 
        load_Dt,
        record_order,
        COUNT(DISTINCT record_nbr) AS Pending_Records,
        SUM(pay_amt) AS Total_Pending_Payments
    FROM DB.record_history
    WHERE final_Dt IS NULL
    GROUP BY load_Dt, record_order
    ORDER BY 1,2 DESC
    

    如果您想每天获取一行(如果有日历天没有相应的“load_dt”天),那么您可以从 sys_calendar.calendar 视图中选择,然后在“load_dt”字段上左连接上面的查询:

    SELECT cal.calendar_date, src.Pending_Records, src.Total_Pending_Payments
    FROM sys_calendar.calendar cal
    LEFT JOIN (
        SELECT 
            load_Dt,
            COUNT(DISTINCT record_nbr) AS Pending_Records,
            SUM(pay_amt) AS Total_Pending_Payments
        FROM DB.record_history
        WHERE record_order = 1
        AND final_Dt IS NULL
        GROUP BY load_Dt
    ) src ON cal.calendar_date = src.load_Dt
    WHERE cal.calendar_date BETWEEN <start_date> AND <end_date>
    ORDER BY 1 DESC
    

    我无法访问 TD 系统,因此您可能会遇到语法错误。让我知道这是否有效,或者您正在寻找其他东西。

    【讨论】:

    • 谢谢你;您的最终建议为我提供了所需的输出,而不需要进一步的复杂性(即存储过程)
    • 没有概率 :) .
    猜你喜欢
    • 2016-12-11
    • 2018-10-04
    • 2021-03-26
    • 2020-09-25
    • 1970-01-01
    • 2019-10-04
    • 2020-06-04
    • 2020-01-13
    • 1970-01-01
    相关资源
    最近更新 更多