使用 Teradata 中的存储过程构建摘要历史 table

Using a stored procedure in Teradata to build a summarial history table

我正在使用连接到企业 DW 的 Terdata SQL 助手。我在下面编写了查询,以显示截至特定时间点的未清项目库存。 table 引用加载和存储新记录,因为加载日期对其状态进行了更改(并且不删除历史记录)。我的查询的输出是指定日期的 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

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

For the most recent load_dt (up until 2017-10-02) for record_order #1, return

1) the number of different pending records
2) the total amount of pending payments

这是正确的吗?如果您要查找此信息,但每个 "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" 天的日历天),那么你可以 SELECT 从 sys_calendar.calendar 视图和 LEFT JOIN上面在 "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 系统,因此您可能会遇到语法错误。让我知道这是否有效,或者您正在寻找其他东西。