2017-04-24 27 views
1

我試圖獲得或一組(分期付款和部分值)內計算的每個記錄的信息內的記錄,我下面用一個例子說明:Postgres的:獲取哪部分是一組

| pay  | date  | value | 
|:-----------|------------:|:-----:| 
| 910006603 | 2017-04-19 | 30 | 
| 910006603 | 2017-04-21 | 30 | 
| 910006603 | 2017-04-23 | 30 | 
| 910006603 | 2017-04-25 | 30 | 
| 910006604 | 2017-04-14 | 45 | 
| 910006604 | 2017-04-18 | 45 | 

有了這些信息,我必須添加其他兩列,說明安裝和它的部分值,使其結果:

| pay  | date  | value | insta | partial| 
|:-----------|------------:|:-----:|:-----:|:------:| 
| 910006603 | 2017-04-19 | 30 | 1  | 30  | 
| 910006603 | 2017-04-21 | 30 | 2  | 60  | 
| 910006603 | 2017-04-23 | 30 | 3  | 90  | 
| 910006603 | 2017-04-25 | 30 | 4  | 120 | 

| 910006604 | 2017-04-14 | 45 | 1  | 45  | 
| 910006604 | 2017-04-18 | 45 | 2  | 90  | 

我希望有足夠的明確,謝謝。

回答

5

你可以通過使用ROW_NUMBER()和SUM()window functions得到它。

create table payments(pay int, dt date, value int); 
insert into payments values 
(910006603, '2017-04-19', 30), 
(910006603, '2017-04-21', 30), 
(910006603, '2017-04-23', 30), 
(910006603, '2017-04-25', 30), 
(910006604, '2017-04-14', 45), 
(910006604, '2017-04-18', 45); 
select pay, 
     dt as date, 
     value, 
     row_number() over (partition by pay order by dt) as insta, 
     sum(value) over (partition by pay order by dt) as partial 
from payments; 
 
     pay | date  | value | insta | partial 
--------: | :--------- | ----: | ----: | ------: 
910006603 | 2017-04-19 | 30 |  1 |  30 
910006603 | 2017-04-21 | 30 |  2 |  60 
910006603 | 2017-04-23 | 30 |  3 |  90 
910006603 | 2017-04-25 | 30 |  4 |  120 
910006604 | 2017-04-14 | 45 |  1 |  45 
910006604 | 2017-04-18 | 45 |  2 |  90 

dbfiddle here

0

試試這個,樂如有任何疑問,請告知我。

select pay, date, value, 
     (select sum(value) from t t2 where t2.pay = t.pay and t2.date <= t.date) as partial, 
     (select count(*) from t t3 where t3.pay = t.pay and t3.date <= t.date) as insta 
from table t;