在递归函数

时间:2018-01-02 07:36:56

标签: sql recursion teradata recursive-query

我正在尝试创建一个包含会计日,月和年的表。 但是,我还想在给定结果中添加实际日期列。

我的查询

(FISCAL_DAY, BEGIN_DATE ,END_DATE ,FISCAL_MONTH,FISCAL_QUARTER,FISCAL_YEAR ) AS
(SELECT CAST(1 AS INT) ,begin_date,end_DATE,FISCAL_MONTH,FISCAL_QUARTER,FISCAL_YEAR FROM DB_NAME.ORIGINAL_FISCAL_TABLE   
UNION ALL 
SEL Fiscal_Day+1,begin_date,end_DATE,FISCAL_MONTH,FISCAL_QUARTER,FISCAL_YEAR  
FROM TMP_FISCAL_DAY WHERE BEGIN_DATE<END_DATE AND FISCAL_DAY<END_DATE-BEGIN_DATE)
SEL * FROM TMP_FISCAL_DAY

输出

+------------+------------+------------+--------------+----------------+-------------+
| FISCAL_DAY | BEGIN_DATE |  END_DATE  | FISCAL_MONTH | FISCAL_QUARTER | FISCAL_YEAR |
+------------+------------+------------+--------------+----------------+-------------+
|          1 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|          2 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|          3 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|          4 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|          5 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|          6 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|          7 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|          8 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|          9 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         10 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         11 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         12 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         13 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         14 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         15 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         16 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         17 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         18 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         19 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         20 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         21 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         22 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         23 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         24 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         25 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         26 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         27 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         28 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         29 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         30 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         31 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         32 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         33 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
|         34 | 12/30/2017 | 02/02/2018 |           12 |              4 |       2,018 |
+------------+------------+------------+--------------+----------------+-------------+

预期输出

+------------+-------------+------------+----------+--------------+----------------+-------------+
| FISCAL_DAY | Actual Date | BEGIN_DATE | END_DATE | FISCAL_MONTH | FISCAL_QUARTER | FISCAL_YEAR |
+------------+-------------+------------+----------+--------------+----------------+-------------+
|          1 | 12/30/2017  | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|          2 | 12/31/2017  | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|          3 | 1/1/2018    | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|          4 | 1/2/2018    | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|          5 | 1/3/2018    | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|          6 | 1/4/2018    | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|          7 | 1/5/2018    | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|          8 | 1/6/2018    | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|          9 | 1/7/2018    | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         10 | 1/8/2018    | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         11 | 1/9/2018    | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         12 | 1/10/2018   | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         13 | 1/11/2018   | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         14 | 1/12/2018   | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         15 | 1/13/2018   | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         16 | 1/14/2018   | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         17 | 1/15/2018   | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         18 | 1/16/2018   | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         19 | 1/17/2018   | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         20 | 1/18/2018   | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         21 | 1/19/2018   | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         22 | 1/20/2018   | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         23 | 1/21/2018   | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         24 | 1/22/2018   | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         25 | 1/23/2018   | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         26 | 1/24/2018   | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         27 | 1/25/2018   | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         28 | 1/26/2018   | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         29 | 1/27/2018   | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         30 | 1/28/2018   | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         31 | 1/29/2018   | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         32 | 1/30/2018   | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         33 | 1/31/2018   | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
|         34 | 2/1/2018    | 12/30/2017 | 2/2/2018 |           12 |              4 |       2,018 |
+------------+-------------+------------+----------+--------------+----------------+-------------+

如何在递归中输入日期以显示实际日期?

我的尝试(不正确的结果)

WITH RECURSIVE TMP_FISCAL_DAY 
(FISCAL_DAY, ACTUAL_DATE, BEGIN_DATE ,END_DATE ,FISCAL_MONTH,FISCAL_QUARTER,FISCAL_YEAR ) AS
(SELECT CAST(1 AS INT) ,cast(current_date as date), begin_date,end_DATE,FISCAL_MONTH,FISCAL_QUARTER,FISCAL_YEAR FROM DB_NAME.ORIGINAL_FISCAL_TABLE    
UNION ALL 
SEL Fiscal_Day+1,ACTUAL_DATE+FISCAL_DAY,begin_date,end_DATE,FISCAL_MONTH,FISCAL_QUARTER,FISCAL_YEAR  
FROM TMP_FISCAL_DAY WHERE BEGIN_DATE<END_DATE AND FISCAL_DAY<END_DATE-BEGIN_DATE)
SEL * FROM TMP_FISCAL_DAY where CURRENT_DATE BETWEEN BEGIN_DATE AND END_DATE

1 个答案:

答案 0 :(得分:2)

假设您的ORIGINAL_FISCAL_TABLE每个会计月有一行,您应该在递归之前过滤当前月份,然后使用BEGIN_DATE代替CURRENT_DATE

WITH RECURSIVE TMP_FISCAL_DAY ( FISCAL_DAY, ACTUAL_DATE, BEGIN_DATE ,END_DATE ,FISCAL_MONTH,FISCAL_QUARTER,FISCAL_YEAR )
AS
 ( 
   SELECT
      Cast(1 AS INT)
     ,BEGIN_DATE
     ,begin_date
     ,end_DATE
     ,FISCAL_MONTH
     ,FISCAL_QUARTER
     ,FISCAL_YEAR 
   FROM DB_NAME.ORIGINAL_FISCAL_TABLE  
   WHERE Current_Date BETWEEN BEGIN_DATE AND END_DATE
   UNION ALL 
   SELECT
      Fiscal_Day+1
     ,ACTUAL_DATE+1
     ,begin_date
     ,end_DATE
     ,FISCAL_MONTH
     ,FISCAL_QUARTER
     ,FISCAL_YEAR  
   FROM TMP_FISCAL_DAY 
   WHERE ACTUAL_DATE+1 < END_DATE
 )
SELECT * 
FROM TMP_FISCAL_DAY 

@RonBallard写道,不需要递归,你可以使用EXPAND ON代替:

SELECT 
  ACTUAL_DATE - BEGIN_DATE + 1 AS Fiscal_Day, dt.*
FROM 
 (
   SELECT Begin(pd) AS ACTUAL_DATE, t.*
   FROM ORIGINAL_FISCAL_TABLE AS t
   WHERE Current_Date BETWEEN BEGIN_DATE AND END_DATE
   EXPAND ON PERIOD(BEGIN_DATE, END_DATE) AS pd
 ) AS dt 

但最后不应该进行任何计算,每家公司都应该有一个带有预先计算数据的日历表:

SELECT ...
FROM myCalendar
WHERE Current_Date BETWEEN FISCAL_MONTH_BEGIN_DATE AND FISCAL_MONTH_END_DATE