2017-04-24 3 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  | 

は、私はあなたに感謝し、十分に明示的であることを願っています:それは結果ように、この情報を使用して私は、割賦およびそれを部分的に値を示す他の2つの列を追加する必要があります。

答えて

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; 
関連する問題