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

我要选择的内容如下:

数据类型,值
魔兽世界,1200
地震 3, 1500
最终幻想,500
select  
  most recent value for 'World of Warcraft', 
  most recent value for 'Quake 3', 
  most recent value for 'Final Fantasy'

因此,我在单个语句中获得了每一个的最新值,而不必将它们分开。我该怎么做呢?

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

Postgresql上其实有一个函数last_value,但是我不熟悉。

如果您希望数据出现在列中,那么您可以使用:

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 回答