[英]iSeries SQL - Use Previous Record Value in JOIN criteria
這可能更簡單 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.