2016-08-28 8 views
1

私はデータテーブルの履歴を持っています。私は、私は必要のあるグラフ、毎日の最新のエントリーを月、年、週ごとに選択する方法は?

  1. 最終エントリを生成したい
  2. 各週の
  3. 最終エントリー各月の
  4. 最終エントリー毎年

ため

  • 最終エントリー選択した期間タイプに基づいてグラフに値を表示します。

    次のSQLコードでは、last entry per dayを取得できます。

    他の3つの結果はどのように取得できますか?

  • +1

    使用 'EXTRACT(tt.created_on FROM WEEK)、EXTRACT(tt.created_onから月)、EXTRACT(tt.created_on FROM年)'クエリの結果。 – Elad

    答えて

    1

    あなたはwindow functionでかなりエレガントにこの問題を解決することができます:週、月の期間については

    SELECT created_on, earned_value, planned_value, budgeted_cost 
    FROM (
        SELECT created_on, earned_value, planned_value, budgeted_cost, 
         rank() OVER (PARTITION BY extract(year from created_on), 
                extract(doy from created_on) 
             ORDER BY created_on DESC) r 
        FROM history) sub 
    WHERE r = 1 
    ORDER BY created_on; 
    

    を、あなたは、単に(1月1日から数えて、今年のDOY =日)extract(week ...extract(doy from created_on)パラメータを変更することができます。年次データの場合は、最初のextract()のみが必要です。したがって、2番目のPARTITIONという用語を削除する必要があります。

    +0

    私はこれがトリックをしないと思う。週に変更すると、03.01.16と03.01.15の日付はextract(create_onからの週)と同じ値になります。これは、異なる期間の値を組み合わせます...週のパーティションには、月と年も含める必要があります。月のパーティションにも、年が含まれています。 – Elad

    +0

    良い点ですが、その週のデータは、年中に週番号を与えるため、月ごとに分割する必要はありません。そして、その日にそれを基礎にするために '日'を 'doy'に変更しました。回答を更新しました – Patrick

    0

    EXTRACT(WEEK FROM tt.created_on), EXTRACT(month FROM tt.created_on),EXTRACT(year FROM tt.created_on)トリックしました。

    SO、毎日の

    の1-最終エントリー

    SELECT t.created_on, 
    t.earned_value, 
    t.planned_value, 
    t.budgeted_cost 
    FROM history t 
    JOIN (SELECT MAX(tt.created_on) 'maxtimestamp' 
    FROM history tt 
    GROUP BY EXTRACT(DAY FROM tt.created_on)) m ON m.maxtimestamp = t.created_on 
    

    2 - 各週の最終エントリー

    SELECT t.created_on, 
    t.earned_value, 
    t.planned_value, 
    t.budgeted_cost 
    FROM history t 
    JOIN (SELECT MAX(tt.created_on) 'maxtimestamp' 
    FROM history tt 
    GROUP BY EXTRACT(WEEK FROM tt.created_on)) m ON m.maxtimestamp = t.created_on 
    

    、3-毎月

    SELECT t.created_on, 
    t.earned_value, 
    t.planned_value, 
    t.budgeted_cost 
    FROM history t 
    JOIN (SELECT MAX(tt.created_on) 'maxtimestamp' 
    FROM history tt 
    GROUP BY EXTRACT(MONTH FROM tt.created_on)) m ON m.maxtimestamp = t.created_on 
    
    のための最終エントリー

    4-最後のeの入力グループへのACH年

    SELECT t.created_on, 
    t.earned_value, 
    t.planned_value, 
    t.budgeted_cost 
    FROM history t 
    JOIN (SELECT MAX(tt.created_on) 'maxtimestamp' 
    FROM history tt 
    GROUP BY EXTRACT(YEAR FROM tt.created_on)) m ON m.maxtimestamp = t.created_on 
    
    関連する問題