我正试图在PostgreSQL上建立一个逻辑,将一些信贷额度标记为“延期”。每行代表一个新的信用额度、更新案例,或者只是术语上的变化(金额或利息,为了简单起见,我没有在表中显示),它不被视为更新的信用额度。将信用额度标记为续延的规则是,该信用额度至少在原信贷额度发放日期后80天或前一次展期后80天获得批准。“旗帜”列显示了我想要实现的目标。'1‘代表新的信用额度或更新,'0’代表其他情况。我想使用标志,以区分哪些信用额度应用于报告(标记为0的不应报告)。在PostgreSQL中做这件事最好的方法是什么。
+----------+-----------+-----------------------+--------+------+------+
| customer | date | days_after_first_line | amount | rank | flag |
+----------+-----------+-----------------------+--------+------+------+
| a | 1/1/2015 | 0 | 100 | 1 | 1 |
| a | 2/28/2015 | 58 | 150 | 2 | 0 |
| a | 3/26/2015 | 84 | 150 | 3 | 1 |
| a | 4/6/2015 | 95 | 170 | 4 | 0 |
| a | 6/11/2015 | 161 | 170 | 5 | 0 |
| a | 6/17/2015 | 167 | 200 | 6 | 1 |
| a | 7/14/2015 | 194 | 200 | 7 | 0 |
| a | 9/14/2015 | 256 | 200 | 8 | 1 |
| a | 9/14/2015 | 256 | 200 | 8 | 1 |
| a | 10/5/2015 | 277 | 200 | 9 | 0 |
| b | 1/1/2014 | 0 | 50 | 1 | 1 |
| b | 3/2/2014 | 60 | 50 | 2 | 0 |
| b | 4/1/2014 | 90 | 50 | 3 | 1 |
| b | 6/15/2014 | 165 | 80 | 4 | 0 |
| b | 7/20/2014 | 200 | 80 | 5 | 1 |
+----------+-----------+-----------------------+--------+------+------+发布于 2015-07-17 05:35:06
您可以使用递归查询:
WITH RECURSIVE t(customer, date, days_after_first_line, amount, rank, flag,
new_flag, last_daysafter)
AS(
SELECT customer, date, days_after_first_line, amount, rank, flag,
1 as new_flag, days_after_first_line As last_daysafter
FROM table1
WHERE days_after_first_line = 0
UNION ALL
SELECT t1.customer, t1.date, t1.days_after_first_line, t1.amount, t1.rank, t1.flag,
CASE WHEN t1.days_after_first_line - t.last_daysafter >=80
THEN 1 ELSE 0
END As flag,
CASE WHEN t1.days_after_first_line - t.last_daysafter >=80
THEN t1.days_after_first_line ELSE t.last_daysafter
END As flag
FROM table1 t1
JOIN t ON t1.customer = t.customer AND t.rank + 1 = t1.rank
)
SELECT * FROM t
order by 1,2;演示:http://sqlfiddle.com/#!15/bb5eb/6
在这个演示中(在这个查询的结果中),flag列是从数据中提取的,而new_flag列是计算出来的,所以您可以将预期的结果与实际的(计算的) new_flag值进行比较。
https://stackoverflow.com/questions/31462586
复制相似问题