2017-03-23 6 views
0

これで2つのテーブルがあります。日付が常に一貫していないID、日付、および値のテーブルを指定して、1か月あたりの値ごとのレコード数を計算します。

locations: 

+----+-----------+ 
| id | name | 
+----+-----------+ 
| 1 | Location1 | 
| 2 | Location2 | 
| 3 | Location3 | 
+----+-----------+ 

location_ratings 
+----+-------------+-----------+--------+ 
| id | location_id | date | rating | 
+----+-------------+-----------+--------+ 
| 1 |   1 | 4/7/2017 |  1 | 
| 2 |   1 | 7/3/2017 |  2 | 
| 3 |   1 | 9/9/2017 |  5 | 
| 4 |   1 | 11/2/2017 |  4 | 
| 5 |   2 | 1/3/2017 |  3 | 
| 9 |   2 | 3/7/2017 |  1 | 
| 12 |   3 | 2/7/2017 |  2 | 
| 13 |   3 | 3/4/2017 |  4 | 
| 15 |   3 | 10/1/2017 |  1 | 
+----+-------------+-----------+--------+ 

ロケーションはランダムに評価され、再び評価されるまでそのレーティングが保持されます。まだ評価されていない場所の評価は0と見なされます。そのため、Location1では4/7/01まで0、その後7/3までなど1/7などでした。

1か月あたりの位置数を計算する必要があります。ここでは、その月の場所の評価は、月の1日目の評価と同じです。

基本的に、各農場の評価は、毎月1日に見つけたいと思っています。

+---------------------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+-----------+ 
| Location ID/Month | 1/1/2017 | 2/1/2017 | 3/1/2017 | 4/1/2017 | 5/1/2017 | 6/1/2017 | 7/1/2017 | 8/1/2017 | 9/1/2017 | 10/1/2017 | 11/1/2017 | 12/1/2017 | 
+---------------------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+-----------+ 
|     1 |  0 |  0 |  0 |  0 |  1 |  1 |  1 |  2 |  2 |   5 |   5 |   5 | 
|     2 |  0 |  3 |  3 |  1 |  1 |  1 |  1 |  1 |  1 |   1 |   1 |   1 | 
|     3 |  0 |  0 |  2 |  4 |  4 |  4 |  4 |  4 |  4 |   4 |   1 |   1 | 
+---------------------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+-----------+ 

そして、これが最終的な結果になります(月額各評価での場所の数)::これは、毎月第一に、各ファームの評価となり、上記の例のデータを使用して

+----------------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+-----------+ 
| Rating/Month | 1/1/2017 | 2/1/2017 | 3/1/2017 | 4/1/2017 | 5/1/2017 | 6/1/2017 | 7/1/2017 | 8/1/2017 | 9/1/2017 | 10/1/2017 | 11/1/2017 | 12/1/2017 | 
+----------------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+-----------+ 
|    0 |  3 |  2 |  1 |  1 |  0 |  0 |  0 |  0 |  0 |   0 |   0 |   0 | 
|    1 |  0 |  0 |  0 |  1 |  2 |  2 |  2 |  1 |  1 |   1 |   2 |   2 | 
|    2 |  0 |  0 |  1 |  0 |  0 |  0 |  0 |  1 |  1 |   0 |   0 |   0 | 
|    3 |  0 |  1 |  1 |  0 |  0 |  0 |  0 |  0 |  0 |   0 |   0 |   0 | 
|    4 |  0 |  0 |  0 |  1 |  1 |  1 |  1 |  1 |  1 |   1 |   0 |   0 | 
|    5 |  0 |  0 |  0 |  0 |  0 |  0 |  0 |  0 |  0 |   1 |   1 |   1 | 
+----------------+----------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+-----------+-----------+ 

私はその最終結果に到達する最善の方法を見つけようとしています。もし私が基本的にそれをすべてクエリーでやることができないか、すべてのデータを取り込んだ後に計算をする必要があるかどうかはわかりません(私はPostgresとRuby on Railsを使用しています)。月にだけでなく週、四半期、年にもこれを行うことができます。どんな提案も大変ありがとうございます。

答えて

0

ここに1つのアプローチがあります。これには、あなたのテーブルにあるゼロレコードは含まれません。それを行う最も簡単な方法は、それらが基本データに表現されていることを確認することです。

create table location_ratings as select * from (values 
    (1, 1, '2017-4-7'::date, 1), 
    (2, 1, '2017-7-3'::date, 2), 
    (3, 1, '2017-9-9'::date, 5), 
    (4, 1, '2017-11-2'::date, 4), 
    (5, 2, '2017-1-3'::date, 3), 
    (9, 2, '2017-3-7'::date, 1), 
    (12, 3, '2017-2-7'::date, 2), 
    (13, 3, '2017-3-4'::date, 4), 
    (15, 3, '2017-10-1'::date, 1) 
) as t(id, location_id, date, rating); 

with months as (
    select generate_series(date_trunc('month', min("date")), 
          date_trunc('month', max("date")+'1 month'::interval), 
          '1 month') as mon 
    from location_ratings 
), 
month_ratings as (
    select distinct on (l.location_id, m.mon) 
     m.mon, l.location_id, l.rating, l.date as rating_date 
    from months m 
    left join location_ratings l on m.mon >= l.date 
    where l.location_id is not null 
    order by l.location_id, m.mon, l.date desc 
) 
--select * from month_ratings; 
select mon, rating, count(*) 
from month_ratings 
group by 1,2 order by 1 asc,2 asc; 

month_ratingsが結果は次のとおりです。

mon   location_id rating rating_date 
1 01.05.2017 00:00:00 1 1 07.04.2017 00:00:00 
2 01.06.2017 00:00:00 1 1 07.04.2017 00:00:00 
3 01.07.2017 00:00:00 1 1 07.04.2017 00:00:00 
4 01.08.2017 00:00:00 1 2 03.07.2017 00:00:00 
5 01.09.2017 00:00:00 1 2 03.07.2017 00:00:00 
6 01.10.2017 00:00:00 1 5 09.09.2017 00:00:00 
7 01.11.2017 00:00:00 1 5 09.09.2017 00:00:00 
8 01.12.2017 00:00:00 1 4 02.11.2017 00:00:00 
9 01.02.2017 00:00:00 2 3 03.01.2017 00:00:00 
10 01.03.2017 00:00:00 2 3 03.01.2017 00:00:00 
11 01.04.2017 00:00:00 2 1 07.03.2017 00:00:00 
12 01.05.2017 00:00:00 2 1 07.03.2017 00:00:00 
13 01.06.2017 00:00:00 2 1 07.03.2017 00:00:00 
14 01.07.2017 00:00:00 2 1 07.03.2017 00:00:00 
15 01.08.2017 00:00:00 2 1 07.03.2017 00:00:00 
16 01.09.2017 00:00:00 2 1 07.03.2017 00:00:00 
17 01.10.2017 00:00:00 2 1 07.03.2017 00:00:00 
18 01.11.2017 00:00:00 2 1 07.03.2017 00:00:00 
19 01.12.2017 00:00:00 2 1 07.03.2017 00:00:00 
20 01.03.2017 00:00:00 3 2 07.02.2017 00:00:00 
21 01.04.2017 00:00:00 3 4 04.03.2017 00:00:00 
22 01.05.2017 00:00:00 3 4 04.03.2017 00:00:00 
23 01.06.2017 00:00:00 3 4 04.03.2017 00:00:00 
24 01.07.2017 00:00:00 3 4 04.03.2017 00:00:00 
25 01.08.2017 00:00:00 3 4 04.03.2017 00:00:00 
26 01.09.2017 00:00:00 3 4 04.03.2017 00:00:00 
27 01.10.2017 00:00:00 3 1 01.10.2017 00:00:00 
28 01.11.2017 00:00:00 3 1 01.10.2017 00:00:00 
29 01.12.2017 00:00:00 3 1 01.10.2017 00:00:00 

http://rextester.com/YFNUD43648

と最終のために:

mon   rating count 
1 01.02.2017 00:00:00 3 1 
2 01.03.2017 00:00:00 2 1 
3 01.03.2017 00:00:00 3 1 
4 01.04.2017 00:00:00 1 1 
5 01.04.2017 00:00:00 4 1 
6 01.05.2017 00:00:00 1 2 
7 01.05.2017 00:00:00 4 1 
8 01.06.2017 00:00:00 1 2 
9 01.06.2017 00:00:00 4 1 
10 01.07.2017 00:00:00 1 2 
11 01.07.2017 00:00:00 4 1 
12 01.08.2017 00:00:00 1 1 
13 01.08.2017 00:00:00 2 1 
14 01.08.2017 00:00:00 4 1 
15 01.09.2017 00:00:00 1 1 
16 01.09.2017 00:00:00 2 1 
17 01.09.2017 00:00:00 4 1 
18 01.10.2017 00:00:00 1 2 
19 01.10.2017 00:00:00 5 1 
20 01.11.2017 00:00:00 1 2 
21 01.11.2017 00:00:00 5 1 
22 01.12.2017 00:00:00 1 2 
23 01.12.2017 00:00:00 4 1 

http://rextester.com/NYMA93544

関連する問題