MySQL Query从表中返回下三个事件

时间:2018-01-17 14:09:32

标签: mysql

我正在尝试创建一个查询,该查询将我们的Account表连接到与我们的还款表的一对多关系。我只想为每个帐户返回第一笔(基于日期)三笔待处理的还款。

因此,例如,如果我有以下简化数据:

loanaccount
encodedkey     id
a1a1a1         a1
b2b2b2         b2
c3c3c3         c3

CREATE TABLE `loanaccount` (
`encodedkey` VARCHAR(32) NOT NULL,
`id` VARCHAR(32) NULL,
PRIMARY KEY (`encodedkey`));
INSERT INTO ``loanaccount` (`encodedkey`, `id`) VALUES ('a1a1a1', 
'a1'),('b2b2b2', 'b2'),('c3c3c3', 'c3');



Repayment
encodedkey   duedate   principaldue   interestdue   parentaccountkey   state
rep1         2018-01-01 7500          5000          a1a1a1           PENDING
rep2         2018-02-01 7500          4000          a1a1a1           PENDING
rep3         2018-03-01 6000          5000          a1a1a1           PENDING
rep4         2017-12-01 4000          4000          a1a1a1           PAID
rep5         2018-01-01 5000          6500          b2b2b2           PENDING
rep6         2018-04-01 6500          5000          b2b2b2           PENDING
rep7         2018-08-01 4000          3000          b2b2b2           PENDING
rep8         2018-09-01 3000          4000          b2b2b2           PENDING
rep9         2018-04-01 8000          4000          a1a1a1           PENDING
rep10        2018-02-01 3500          4000          c3c3c3           PENDING

CREATE TABLE `repayment` (
`encodedkey` VARCHAR(32) NOT NULL,
`duedate` DATE NULL,
`principaldue` DECIMAL(18,2) NULL,
`interestdue` DECIMAL(18,2) NULL,
`parentaccountkey` VARCHAR(32) NULL,
`state` VARCHAR(45) NULL,
PRIMARY KEY (`encodedkey`));

INSERT INTO repayment (encodedkey, duedate, principaldue, interestdue, parentaccountkey, state) VALUES
('rep1', '2018-01-01', '7500', '5000', 'a1a1a1', 'PENDING'),
('rep2', '2018-02-01', '7500', '4000', 'a1a1a1', 'PENDING'),
('rep3', '2018-03-01', '6000', '5000', 'a1a1a1', 'PENDING'),
('rep4', '2017-12-01', '4000', '4000', 'a1a1a1', 'PAID')   ,
('rep5', '2018-01-01', '5000', '6500', 'b2b2b2', 'PENDING'),
('rep6', '2018-04-01', '6500', '5000', 'b2b2b2', 'PENDING'),
('rep7', '2018-08-01', '4000', '3000', 'b2b2b2', 'PENDING'),
('rep8', '2018-09-01', '3000', '4000', 'b2b2b2', 'PENDING'),
('rep9', '2018-04-01', '8000', '4000', 'a1a1a1', 'PENDING'),
('rep10','2018-02-01', '3500', '4000', 'c3c3c3', 'PENDING');

我希望展示的结果是:

loanaccount.id     rep.duedate   rep.principaldue   rep.interestdue   rep.state
a1                 2018-01-01    7500               5000              PENDING
a1                 2018-02-01    7500               4000              PENDING
a1                 2018-03-01    6000               5000              PENDING
b2                 2018-01-01    5000               6500              PENDING
b2                 2018-04-01    6500               5000              PENDING
b2                 2018-08-01    4000               3000              PENDING
c3                 2018-02-01    3500               4000              PENDING

使用我在本网站其他地方找到的帮助,我创建了一个查询,它将返回最早的待处理还款。它看起来像这样:

select *

from loanaccount la
join (SELECT la.encodedkey
    ,la.id
    , rep.duedate
    ,rep.PRINCIPALDUE
    ,rep.INTERESTDUE
 from loanaccount la
 JOIN (SELECT
  rep.encodedkey
  ,rep.parentaccountkey
  ,min(rep.duedate) as MinDate
  ,rep.principaldue
  ,rep.interestdue
  from repayment rep
  where rep.state = 'PENDING'
  group by rep.parentaccountkey
  ) MinDates on la.ENCODEDKEY = mindates.parentaccountkey 
  join repayment rep on mindates.parentaccountkey = rep.PARENTACCOUNTKEY
  and mindates.mindate = rep.duedate
  where rep.state = 'PENDING'
  ) repa on repa.id = la.id

我想做的是,从每个帐户的还款表中获取3个最早的duedates。还款不一定符合标准时间表 - 即不是所有月度或季度。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

E.g:

SELECT duedate
     , principaldue
     , interestdue
     , state 
  FROM 
     ( SELECT x.* 
            , CASE WHEN @prev = parentaccountkey THEN @i:=@i+1 ELSE @i:=1 END rank
            , @prev:=parentaccountkey prev 
         FROM repayment x
            , (SELECT @prev:=null,@i:=0) vars 
        WHERE state = 'pending' 
        ORDER 
           BY parentaccountkey
            , duedate
     ) a
 WHERE rank <= 3;
+------------+--------------+-------------+---------+
| duedate    | principaldue | interestdue | state   |
+------------+--------------+-------------+---------+
| 2018-01-01 |      7500.00 |     5000.00 | PENDING |
| 2018-02-01 |      7500.00 |     4000.00 | PENDING |
| 2018-03-01 |      6000.00 |     5000.00 | PENDING |
| 2018-01-01 |      5000.00 |     6500.00 | PENDING |
| 2018-04-01 |      6500.00 |     5000.00 | PENDING |
| 2018-08-01 |      4000.00 |     3000.00 | PENDING |
| 2018-02-01 |      3500.00 |     4000.00 | PENDING |
+------------+--------------+-------------+---------+

关于加入另一张桌子的一点是留给读者的练习