簡體   English   中英

iSeries SQL - 在 JOIN 條件中使用先前的記錄值

[英]iSeries SQL - Use Previous Record Value in JOIN criteria

在我的示例中,我試圖根據以前的日歷工作日期從事務文件中檢索記錄。 工作日期在一個名為 CALNDR 的文件中,交易在一個名為 TRNHST 的文件中。 邏輯是使用 CURRENT_DATE 在 CALNDR 上設置 cursor,然后檢索將用於加入 TRNHST 的先前工作日期。 如果在 RPG 中完成,這將很簡單,但我對 SQL 不知所措。 謝謝,您可以提供任何輸入。

日歷

TRNHST

這可能更簡單 SQL 。
您可以取消注釋已注釋掉的塊以按原樣運行它以進行檢查。

/*
WITH 
  CALNDR (DT, IS_WORK) AS
  (
    VALUES
      (CURRENT_DATE - 1 DAY, 'N')
    , (CURRENT_DATE - 2 DAY, 'Y')
    , (CURRENT_DATE - 3 DAY, 'Y')
  )
, TRNHST (DT, SOME_COL) AS 
  (
    VALUES
      (CURRENT_DATE - 1 DAY, 1)
    , (CURRENT_DATE - 2 DAY, 2)
    , (CURRENT_DATE - 3 DAY, 3)
  )  
*/
SELECT CURRENT_DATE AS CDT, T.*
FROM
(
  SELECT MAX (DT) DT
  FROM CALNDR
  WHERE DT < CURRENT_DATE AND IS_WORK = 'Y'
) C
JOIN TRNHST T ON T.DT = C.DT

老實說,如果您需要給定日期的“前工作日”。 您應該考慮將這樣的列添加到您的日歷表中。

當您使用它時,不妨添加一個“下一個工作日”。

日歷表的最大好處之一是能夠預先計算這些列。 因此,大大簡化了您的陳述。

不確定 LAG 是做什么的,因為我從未使用過它。 因此,這是使用交叉連接的另一種解決方案:

WITH calendar (workdt) AS (
    VALUES (CAST('2022-01-01' AS date)),
           (CAST('2022-02-01' AS date)),
           (CAST('2022-03-01' AS date)),
           (CAST('2022-04-01' AS date))
    ),
orders (orderno, orderdt) AS (
    VALUES (1, CAST('2022-01-15' AS date)),
           (2, CAST('2022-02-15' AS date)),
           (3, CAST('2022-03-15' AS date)),
           (4, CAST('2022-04-15' AS date))
    )
SELECT * 
FROM orders a
CROSS JOIN LATERAL (SELECT max(workdt) prevdt FROM calendar WHERE workdt < a.orderdt) b

交叉連接只為日歷文件中的每條記錄返回一行,並且該行包含小於訂單日期的最大工作日期。 LATERAL 只是讓子查詢訪問外部查詢中的列。

編寫一個名為calndr_prevWorkDate的 SQL function 返回上一個工作日期。

Then use that function in the WHERE clause of an SQL SELECT statement to select records from the TRNHST table:

select     a.*  
from       trnhst a                    
where      a.trandate = calndr_prevWorkDate( )  

這是 SQL function。

CREATE OR REPLACE FUNCTION calndr_prevWorkDate(                
startDate   date default current date )                        
RETURNS     date                                               
language sql                                                   
specific    calndrf1                                           
SET OPTION  datfmt = *ISO,   DLYPRP = *YES, DBGVIEW = *SOURCE, 
            USRPRF = *OWNER, DYNUSRPRF = *OWNER, COMMIT = *CHG 
BEGIN                                                          
                                                               
declare     vCalDate  date ;                                   
declare     vSqlCode decimal(5,0) default 0 ;                  
declare     sqlCode int default 0 ;                            
declare     sqlState char(5) default ' ' ;                     
declare     vSqlState char(5) default ' ' ;                    
declare     vErrText varchar(256) default '' ;                 
                                                               
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION                      
begin                                                          
SET     vSqlCode  = SQLCODE ;                                  
SET     vSqlState = SQLstate ;                                 
get     diagnostics exception 1 vErrText = message_text ;      
end ;                                                          
                                                               
select      a.caldate                                
into        vCalDate                                 
from        calndr a                                 
where       a.caldate < startDate                    
            and dayofweek(a.caldate) not in ( 1, 7)  
order by    a.caldate desc                           
fetch first row only ;                               
                                                     
return      vCalDate ;                               
END                                                  

如果您只需要表格中的上一個日期,您可以使用類似的東西

select * 來自 TRNHST where Trans_Date = ( select calendar_Date from CALNDR where calendar_Date < current date order by calendar_Date desc limit 1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM