sql - 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 子句中提取第一个值。任何帮助将不胜感激。
解决方案
对于您的示例,您可以使用:
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
在另一行中有另一个值。但是您的示例数据没有这样的示例。
推荐阅读
- javascript - 在异步函数中的 if 语句之后使用变量
- android - Wrapped Drawable 显示不正确
- modelica - 如何在 Dymola 中导出矢量图形?
- linux-kernel - sem_post/sem_wait 如何区分基于内存和基于内核的信号量
- python-3.x - 对于 Python 库 parsedatetime,尾随返回值是什么意思?
- java - Java:如何实现 SortedMap 即 TreeMap
- django - 列表视图中使用 ContentType 框架的 DRF 光标分页
- javascript - JQuery val() 仅在输入 2 个字符时为真
- javascript - 提取值
使用 javascript 将属性赋予变量 - swift - 将 SwiftUI 与自定义发布者结合使用 - 使用 .assign 订阅者时出现意外行为