2013-08-28 62 views
0

我有了数据的表,看起来是这样的:在单个SQL语句中选择最近的多个值

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, value 
World of Warcraft, 1200 
Quake 3, 1500 
Final Fantasy, 500 
select 
    most recent value for 'World of Warcraft', 
    most recent value for 'Quake 3', 
    most recent value for 'Final Fantasy' 

所以我在单个语句中获得了每个元素的最新值,而不必将它们分开。我会如何去做这件事?

+0

[使用单个SQL语句选择多个Max()值的可能的重复-postgresql](http://stackoverflow.com/questions/18494829/selecting-multiple-max-values-using-a-single-sql -statement-postgresql) –

+0

我没有,这个问是关于选择最近的地方,因为另一个是要求最大值http://stackoverflow.com/questions/18494829/selecting-multiple-max-values-using -a-single-sql-statement-postgresql 如果您阅读了评论,那么帮助的人就是真正提出新问题的人。但感谢您的帮助.... – user2146933

+0

@a_horse_with_no_name这实际上是一个不同的问题 – Lamak

回答

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 
+0

我相信他们也希望将结果放在单独的列中,因此您可能需要对其进行转换。 :) – Taryn

+0

@bluefeet哦,没有意识到这一点,因为他发布的第一个结果集是在不同的行。但你是对的,他发布了一些提示来转换的伪查询。工作太多,我们需要有更多专业知识的人:-) – Lamak

+0

你走了! – Taryn

0

另一种情况为DISTINCT ON。更简单和更快:

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

您可以包含或排除您喜欢的任何列。更多的解释和细节:
Select first row in each GROUP BY group?

我用data_typeDESC,因为你的例子表明,你想为你的数据类型的降序排列。如果你不在意,省略DESC

您还应该规范化您的数据。为您的数据类型创建查找表,并只将外键存储在主表中。 Example.