首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL上的标记逻辑

PostgreSQL上的标记逻辑
EN

Stack Overflow用户
提问于 2015-07-16 19:10:31
回答 1查看 289关注 0票数 0

我正试图在PostgreSQL上建立一个逻辑,将一些信贷额度标记为“延期”。每行代表一个新的信用额度、更新案例,或者只是术语上的变化(金额或利息,为了简单起见,我没有在表中显示),它不被视为更新的信用额度。将信用额度标记为续延的规则是,该信用额度至少在原信贷额度发放日期后80天或前一次展期后80天获得批准。“旗帜”列显示了我想要实现的目标。'1‘代表新的信用额度或更新,'0’代表其他情况。我想使用标志,以区分哪些信用额度应用于报告(标记为0的不应报告)。在PostgreSQL中做这件事最好的方法是什么。

代码语言:javascript
复制
+----------+-----------+-----------------------+--------+------+------+
| 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 |
+----------+-----------+-----------------------+--------+------+------+
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-17 05:35:06

您可以使用递归查询:

代码语言:javascript
复制
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值进行比较。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31462586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档