【问题标题】:Min function in postgresqlpostgresql 中的 min 函数
【发布时间】:2013-05-04 14:05:30
【问题描述】:

我正在尝试找到人口密度最低的部门,为此我做了以下操作:

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 行,我会收到错误消息。非常感谢任何帮助!

【问题讨论】:

  • multiplied by 1000 (so it is in square metres) .. 这很奇怪。你的基本单位是什么? 31.623x31.623 米的正方形?难以置信。

标签: sql postgresql group-by min


【解决方案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

如果真的有必要,可以使用LIMIT 1 轻松执行“仅返回一行”规则

【讨论】:

  • @AndreiIvanov:此查询忽略了HAVING count(*) > 1 部分并且不等效。嗯,这个问题对于确切的目标非常模糊。
  • @ErwinBrandstetter OP 的目标是找到最小的密度
  • 如果这就是他想要的,那么你的答案是正确的,但它可能会简单得多,而且 Q 具有误导性。
【解决方案2】:

没有子查询:

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;

【讨论】:

  • 感谢您的回答,但这并没有返回最小的密度...可能是因为它仍然按 edname 分组!?
  • @AndreiIvanov:我很确定确实如此。准确地说:在一个edname 至少存在2 行的那些中最小的密度。这就是 HAVING COUNT (*) > 1(就像在您的原始查询中一样)所做的。
猜你喜欢
  • 1970-01-01
  • 2021-01-02
  • 2014-04-24
  • 2012-07-07
  • 2020-08-03
  • 2016-03-22
  • 2021-07-05
  • 2018-07-02
  • 1970-01-01
相关资源
最近更新 更多