2013-05-09 37 views
0

我试图找到与人口密度最低的一个部门这样做,我做了以下内容:Min函数在PostgreSQL的

SELECT P.edname, MIN((P.total_area*1000)/P.total2011) AS "Lowest population density" 
FROM eds_census2011 P 
GROUP BY P.edname 
HAVING COUNT (*)> 1 

total_area乘以1000(所以它在平方米)除以总人口。 我只想要一个记录显示事业部(edname)和人口密度至极计算(MIN((P.total_area*1000)/P.total2011)),而不是我得到的所有记录 - 即使没有排序......

的问题是,我通过edname有组它,如果我忽略了GROUP BYHAVING行,则会出现错误。任何帮助非常appriciated!

+0

'乘以1000(所以它在平方米)'..这是奇怪的。你的基地单位会是什么?广场面积31.623x31.623米?难以置信。 – 2013-05-10 00:21:13

回答

1

尝试

SELECT edname, (total_area*1000/total2011) density 
    FROM eds_census2011 
WHERE (total_area*1000/total2011) = (SELECT MIN(total_area*1000/total2011) FROM eds_census2011) 

SQLFiddle

A '只返回一行' 规则可以利用LIMIT 1如果真的有必要

+0

谢谢,它的工作! – 2013-05-10 00:28:32

+0

不客气。很高兴帮助。 – peterm 2013-05-10 00:30:02

+0

@AndreiIvanov:这个查询忽略了'HAVING count(*)> 1'部分,并不等价。那么,这个问题对于确切的目标非常模糊。 – 2013-05-10 00:34:24

1

无子查询很容易地执行:

SELECT p.edname, min((p.total_area * 1000)/p.total2011) AS lowest_pop 
FROM eds_census2011 p 
GROUP BY p.edname 
HAVING COUNT (*) > 1 
ORDER BY 2 
LIMIT 1; 

这个只返回1行(如果有任何限定),即使多行具有同样低的密度。

如果你只是想密度最低,周期,这样可以更简单:

SELECT edname, (total_area * 1000)/total2011) AS lowest_pop 
FROM eds_census2011 
ORDER BY 2 
LIMIT 1; 
+0

感谢您的回答,但是这不会返回最小的密度......也许是因为它仍然按edname分组! – 2013-05-10 00:39:47

+0

@AndreiIvanov:我很确定它的确如此。准确地说:对于一个'edname'至少存在2行的密度最小。这就是'具有计数(*)> 1'(就像你原来的查询)一样。 – 2013-05-10 00:46:57