db2 如何使用跳过的日期递增值

rqmkfv5c  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(154)

因此,我有一个记录贷款数据的表和另一个记录每个帐号的过期日期的表。我需要计算某人从过期日期起多少天没有支付贷款。我已经做了一个查询,现在我的结果如下所示

LOAN_DATE   ACC_NO      PASTDUE_DATE    PASTDUE_DAYS
2022-08-11  1079696087  null                 0
2022-08-12  1079696087  null                 0
2022-08-13  1079696087  null                 0
2022-08-14  1079696087  null                 0
2022-08-15  1079696087  null                 0
2022-08-16  1079696087  2022-08-16           1
2022-08-18  1079696087  2022-08-18           2
2022-08-19  1079696087  2022-08-19           3
2022-08-20  1079696087  2022-08-20           4
2022-08-22  1079696087  2022-08-22           5
2022-08-23  1079696087  2022-08-23           6
2022-08-24  1079696087  2022-08-24           7
2022-08-25  1079696087  2022-08-25           8
2022-08-26  1079696087  2022-08-26           9
2022-08-27  1079696087  2022-08-27           10
2022-08-29  1079696087  2022-08-29           11
2022-08-30  1079696087  2022-08-30           12
2022-09-01  1079696087  null                 0
2022-09-02  1079696087  2022-09-02           1

请注意,我的LOAN_DATE数据跳过了一些日期,我需要PASTDUE_DAYS值仍然计数,即使日期不存在。

LOAN_DATE   ACC_NO      PASTDUE_DATE    PASTDUE_DAYS
2022-08-11  1079696087  null                 0
2022-08-12  1079696087  null                 0
2022-08-13  1079696087  null                 0
2022-08-14  1079696087  null                 0
2022-08-15  1079696087  null                 0
2022-08-16  1079696087  2022-08-16           1
2022-08-18  1079696087  2022-08-18           3
2022-08-19  1079696087  2022-08-19           4
2022-08-20  1079696087  2022-08-20           5
2022-08-22  1079696087  2022-08-22           7
2022-08-23  1079696087  2022-08-23           8
2022-08-24  1079696087  2022-08-24           9
2022-08-25  1079696087  2022-08-25           10
2022-08-26  1079696087  2022-08-26           11
2022-08-27  1079696087  2022-08-27           12
2022-08-29  1079696087  2022-08-29           14
2022-08-30  1079696087  2022-08-30           15
2022-09-01  1079696087  null                 0
2022-09-02  1079696087  2022-09-02           1

有什么我可以尝试的吗?如果我的解释有点尴尬的话,对不起
这是我的dbfiddle:https://dbfiddle.uk/AdcGy89l

pcrecxhr

pcrecxhr1#

WITH LOAN (LOAN_DATE, ACC_NO) AS (
VALUES
(DATE('2022-08-11'), '1079696087'),
(DATE('2022-08-12'), '1079696087'),
(DATE('2022-08-13'), '1079696087'),
(DATE('2022-08-14'), '1079696087'),
(DATE('2022-08-15'), '1079696087'),
(DATE('2022-08-16'), '1079696087'),
(DATE('2022-08-18'), '1079696087'),
(DATE('2022-08-19'), '1079696087'),
(DATE('2022-08-20'), '1079696087'),
(DATE('2022-08-22'), '1079696087'),
(DATE('2022-08-23'), '1079696087'),
(DATE('2022-08-24'), '1079696087'),
(DATE('2022-08-25'), '1079696087'),
(DATE('2022-08-26'), '1079696087'),
(DATE('2022-08-27'), '1079696087'),
(DATE('2022-08-29'), '1079696087'),
(DATE('2022-08-30'), '1079696087'),
(DATE('2022-09-01'), '1079696087'),
(DATE('2022-09-02'), '1079696087')
),

LOAN_PASTDUE (PASTDUE_DATE, ACC_NO) AS (
VALUES
(DATE('2022-08-16'), '1079696087'),
(DATE('2022-08-18'), '1079696087'),
(DATE('2022-08-19'), '1079696087'),
(DATE('2022-08-20'), '1079696087'),
(DATE('2022-08-22'), '1079696087'),
(DATE('2022-08-23'), '1079696087'),
(DATE('2022-08-24'), '1079696087'),
(DATE('2022-08-25'), '1079696087'),
(DATE('2022-08-26'), '1079696087'),
(DATE('2022-08-27'), '1079696087'),
(DATE('2022-08-29'), '1079696087'),
(DATE('2022-08-30'), '1079696087'),
(DATE('2022-09-02'), '1079696087')
),
G AS (
  -- group number generation
  -- it increases when 
  -- PASTDUE_DATE IS NULL OR "PASTDUE_DATE_PREVIOUS" (LOAN_DATE sort) IS NULL
SELECT
   A.*
  , B.PASTDUE_DATE
  , SUM 
  (
    CASE 
      WHEN 
         B.PASTDUE_DATE IS NULL 
      OR LAG (B.PASTDUE_DATE) OVER (PARTITION BY A.ACC_NO ORDER BY A.LOAN_DATE) IS NULL
      THEN 1
      ELSE 0
    END
  ) OVER (PARTITION BY A.ACC_NO ORDER BY A.LOAN_DATE)
  AS GRP
FROM LOAN A
LEFT JOIN LOAN_PASTDUE B ON B.PASTDUE_DATE = A.LOAN_DATE AND B.ACC_NO = A.ACC_NO
)
SELECT 
  LOAN_DATE, ACC_NO, PASTDUE_DATE
, CASE 
    WHEN PASTDUE_DATE IS NOT NULL
    THEN DAYS (LOAN_DATE) - DAYS (MIN (LOAN_DATE) OVER (PARTITION BY ACC_NO, GRP)) + 1
    ELSE 0
  END
  AS PASTDUE_DAYS
FROM G
ORDER BY ACC_NO, LOAN_DATE

| 贷款日期|ACC_否|过期日期|过期_天数|
| - -|- -|- -|- -|
| 2022年8月11日|小行星1079696087||第0页|
| 2022年8月12日|小行星1079696087||第0页|
| 2022年8月13日|小行星1079696087||第0页|
| 2022年8月14日|小行星1079696087||第0页|
| 2022年8月15日|小行星1079696087||第0页|
| 2022年8月16日|小行星1079696087| 2022年8月16日|一个|
| 2022年8月18日|小行星1079696087| 2022年8月18日|三个|
| 2022年8月19日|小行星1079696087| 2022年8月19日|四个|
| 2022年8月20日|小行星1079696087| 2022年8月20日|五个|
| 2022年8月22日|小行星1079696087| 2022年8月22日|七个|
| 2022年8月23日|小行星1079696087| 2022年8月23日|八个|
| 2022年8月24日|小行星1079696087| 2022年8月24日|九个|
| 2022年8月25日|小行星1079696087| 2022年8月25日|10个|
| 2022年8月26日|小行星1079696087| 2022年8月26日|十一|
| 2022年8月27日|小行星1079696087| 2022年8月27日|十二个|
| 2022年8月29日|小行星1079696087| 2022年8月29日|十四|
| 2022年8月30日|小行星1079696087| 2022年8月30日|十五个|
| 2022年9月1日|小行星1079696087||第0页|
| 2022年9月2日|小行星1079696087| 2022年9月2日|一个|

相关问题