首页 > 解决方案 > PostgreSQL 中的首次付款违约和迟到天数

问题描述

我有这张桌子:

CREATE TABLE my_table 
(
    the_debt_id varchar(6) NOT NULL, 
    the_debt_paid timestamp, 
    the_debt_due date NOT NULL
)

INSERT INTO my_table
VALUES ('LMUS01', '2019-05-02 09:00:01', '2019-05-02'), 
       ('LMUS01', '2019-06-04 10:45:12', '2019-06-02'), 
       ('LMUS01', '2019-07-05 15:39:58', '2019-07-02'), 
       ('LMUS02', '2019-05-03 19:43:44', '2019-05-07'), 
       ('LMUS02', '2019-06-07 08:37:05', '2019-06-07'),
       ('LMUS02',NULL, '2019-07-07'),
       ('LMUS03',NULL, '2019-05-07'),
       ('LMUS03',NULL, '2019-06-07')

我想计算第一个付款默认值(如果每个 the_debt_id 的第一个元素为 NULL 为 1,则按 the_due_date 排序)、迟到天数的总和(the_debt_due 之后经过的天数)和付款数量。这是预期的结果:

the_debt_id    first_payment_default    tardy_days    payments
LMUS01         0                        5             3
LMUS02         0                        0             3
LMUS03         1                        0             2

我试过这段代码:

SELECT the_debt_id, 
SUM(the_debt_paid::date - the_debt_due) AS tardy_days, 
FIRST_VALUE(the_debt_paid)::int first_payment_default,
COUNT(*) AS payments  
FROM my_table
GROUP BY the_debt_id

但我猜第一个总和会给我最后一个 the_debt_id 的 null,我不知道如何从 GROUP BY 子句中提取第一个值。任何帮助将不胜感激。

标签: sqlpostgresql

解决方案


对于您的示例,您可以使用:

SELECT the_debt_id, 
       COALESCE(SUM(the_debt_paid::date - the_debt_due), 0) AS tardy_days, 
       (MIN(the_debt_paid) IS NULL) as first_payment_default,
       COUNT(*) AS payments  
FROM my_table
GROUP BY the_debt_id;

我不确定你是否可以NULL在另一行中有另一个值。但是您的示例数据没有这样的示例。


推荐阅读