2010-01-23 75 views
1

说我有像这样的表:每组有一条记录?

x1 | y1 | x2 | y2 | area | color 

5 | 0 | 5 | 0 | 1 | r 
5 | 0 | 6 | 0 | 2 | g 
5 | 1 | 5 | 0 | 2 | b 
5 | 1 | 5 | 1 | 2 | r 
5 | 2 | 5 | 0 | 3 | g 
5 | 2 | 5 | 1 | 3 | b 

如何可以构造SQL查询,以便所得到的表中有R,G,B(每一个都具有最大面积)的一个,也保存此记录的坐标?我尝试了MAX(AREA)和GROUP BY颜色,但是这给了我r,g,b最大面积的记录,但没有与它们的坐标一起。

我使用PostgreSQL样本输出(上面的),应该是这样的:

5 | 1 | 5 | 1 | 2 | r 
5 | 2 | 5 | 0 | 3 | g 
5 | 2 | 5 | 1 | 3 | b 

基本上它应该返回4,第5和第6次的纪录。

+4

你能展示你想要的输出样本吗? –

+1

你能提供一个来自这个查询的示例输出吗?我对此有一点理解。 – llamaoo7

+0

不清楚你在做什么。 “最大面积”是指所有颜色或一种特定颜色的最大面积? – John

回答

3

你的问题有点不清楚,但我想你想的:

SELECT T2.* FROM (
    SELECT color, max(area) AS area 
    FROM table1 
    GROUP BY color) AS T1 
JOIN table1 AS T2 
ON T1.area = T2.area AND T1.color = T2.color 

注意,它假定最大面积是唯一的,否则你将得到多个行。

输出为您的数据:

x1 | x2 | y1 | y2 | area | color 
5 | 1 | 5 | 1 | 2 |  r 
5 | 2 | 5 | 0 | 3 |  g 
5 | 2 | 5 | 1 | 3 |  b 

如果你想要一个更好的答案,请澄清我已经发布的评论(其中一些被隐藏)的所有问题。

+0

对于给定的表格,这是正确的答案,但将派生表加入独特的主键是更好的做法。当多个'r'行具有相同的区域时,会发生什么情况,但行中其他地方的数据不同? –

+0

@Michael,你当然应该使用PK。我在评论中询问他是否有主键,但他还没有回答。因此,我会假设他没有一个PK直到告诉别的。不幸的是,我的很多要求澄清的评论已被隐藏:( –

+0

不用担心,我的评论更多地指向OP,以及任何未来观看此视频的人。 –

0
select *, max(area), color from T group by color; 
相关问题