0

次のようなデータを含むテーブルがあります。

data_type, value, datetime
World of Warcraft, 500, 2012-12-02
Quake 3, 1500, 2013-12-02
Quake 3, 1400, 2013-02-04
World of Warcraft, 1200, 2013-05-20
Final Fantasy, 100, 2013-02-03
Final Fantasy, 500, 2013-03-05

私が選択したいのは、次のようなものです。

data_type、値
World of Warcraft、1200
地震 3、1500
ファイナルファンタジー 500
select  
  most recent value for 'World of Warcraft', 
  most recent value for 'Quake 3', 
  most recent value for 'Final Fantasy'

したがって、これらを分離するのではなく、1 つのステートメントでそれぞれの最新の値を取得します。どうすればこれを行うことができますか?

4

2 に答える 2

2

これは次のことを行う必要があります。

SELECT *
FROM (  SELECT  *, 
                ROW_NUMBER() OVER(PARTITION BY data_type 
                                  ORDER BY datetimecol DESC) AS RN
        FROM YourTable) AS A
WHERE RN = 1

実はlast_valuePostgresqlにも関数はあるのですが、よく知りません。

データを列に表示する場合は、次を使用できます。

SELECT 
    max(case when data_type='World of Warcraft' then value end) WorldofWarcraft,
    max(case when data_type='Quake 3' then value end) Quake3,
    max(case when data_type='Final Fantasy' then value end) FinalFantasy
FROM (  SELECT  data_type, value, datetime, 
                ROW_NUMBER() OVER(PARTITION BY data_type 
                                  ORDER BY datetimecol DESC) AS RN
        FROM YourTable) AS A
WHERE RN = 1
于 2013-08-28T19:12:48.447 に答える
0

の別のケースDISTINCT ON。はるかにシンプルで高速:

SELECT DISTINCT ON (data_type)
       data_type, value
FROM   tbl
ORDER  BY data_type DESC, datetime DESC;

好きな列を含めたり除外したりできます。詳細と説明:
各 GROUP BY グループの最初の行を選択しますか?

data_type DESCあなたの例は、データ型の降順が必要であることを示しているため、私は を使用します。DESC気にしなければ省略。

また、データを正規化する必要があります。データ型のルックアップ テーブルを作成し、外部キーのみをメイン テーブルに格納します。例。

于 2013-08-28T20:48:24.843 に答える