1

Postgres 9.1 データベースがあります。(特定の日付範囲で) 1 週間あたりのレコード数を生成し、それを前年と比較しようとしています。

シリーズを生成するために使用される次のコードがあります。

select generate_series('2013-01-01', '2013-01-31', '7 day'::interval) as series

ただし、カウントされたレコードを生成された日付に結合する方法がわかりません。

したがって、例として次のレコードを使用します。

Pt_ID      exam_date
======     =========
1          2012-01-02
2          2012-01-02
3          2012-01-08
4          2012-01-08
1          2013-01-02
2          2013-01-02
3          2013-01-03
4          2013-01-04
1          2013-01-08
2          2013-01-10
3          2013-01-15
4          2013-01-24

私はレコードを次のように返したいと思っていました:

  series        thisyr      lastyr
===========     =====       =====
2013-01-01        4           2
2013-01-08        3           2
2013-01-15        1           0
2013-01-22        1           0
2013-01-29        0           0

サブサーチで日付範囲を参照する方法がわかりません。ご協力ありがとうございます。

4

2 に答える 2

1

動作するcross joinはずのを使用して、SQL Fiddle からのマークダウン出力を以下に貼り付けます。あなたのサンプル出力はシリーズ 2013-01-08 では正しくないようです: thisyr は 3 ではなく 2 である必要があります.これはこれを行うための最良の方法ではないかもしれません.

SQL フィドル

PostgreSQL 9.2.4 スキーマのセットアップ:

CREATE TABLE Table1
    ("Pt_ID" varchar(6), "exam_date" date);

INSERT INTO Table1
    ("Pt_ID", "exam_date")
VALUES
    ('1', '2012-01-02'),('2', '2012-01-02'),
    ('3', '2012-01-08'),('4', '2012-01-08'),
    ('1', '2013-01-02'),('2', '2013-01-02'),
    ('3', '2013-01-03'),('4', '2013-01-04'),
    ('1', '2013-01-08'),('2', '2013-01-10'),
    ('3', '2013-01-15'),('4', '2013-01-24');

クエリ 1 :

select 
  series, 
  sum (
    case 
      when exam_date 
        between series and series + '6 day'::interval
      then 1 
      else 0 
    end
  ) as thisyr,
  sum (
    case 
      when exam_date + '1 year'::interval 
        between series and series + '6 day'::interval
      then 1 else 0 
    end
  ) as lastyr

from table1
cross join generate_series('2013-01-01', '2013-01-31', '7 day'::interval) as series
group by series
order by series

結果

|                         SERIES | THISYR | LASTYR |
|--------------------------------|--------|--------|
| January, 01 2013 00:00:00+0000 |      4 |      2 |
| January, 08 2013 00:00:00+0000 |      2 |      2 |
| January, 15 2013 00:00:00+0000 |      1 |      0 |
| January, 22 2013 00:00:00+0000 |      1 |      0 |
| January, 29 2013 00:00:00+0000 |      0 |      0 |
于 2014-11-09T23:14:10.047 に答える