首页 > 解决方案 > 如何使用 WHERE 子句获得前 3 个平均值?

问题描述

我正在使用一个法国房地产数据库,其中记录了每学期在法国的所有销售额。它有3个表:

  1. Localite,具有城市(公社)和州(部门)数据,
  2. Bien,具有房屋数据(m²、地址等),仅在此查询中使用,因为表的链接方式,以及
  3. 具有价格(ValeurFonciere)数据的突变。

使用以下方法创建的:

CREATE TABLE Localite (
Commune_ID SMALLINT UNSIGNED NOT NULL,
Commune VARCHAR(50) NOT NULL,
Departement VARCHAR(3) NOT NULL,
PRIMARY KEY (Commune_ID)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE Bien (
Bien_ID SMALLINT UNSIGNED NOT NULL,
SurCar1 FLOAT NOT NULL,
TypeLoc VARCHAR(15) NOT NULL,
NoPP SMALLINT NOT NULL,
NoVoie VARCHAR(5) NOT NULL,
TypeVoie VARCHAR(10) NOT NULL,
NomVoie VARCHAR(50) NOT NULL,
CodePostal VARCHAR(5) NOT NULL,
Commune_ID SMALLINT UNSIGNED NOT NULL,
PRIMARY KEY (Bien_ID)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE Mutation (
Mutation_ID SMALLINT UNSIGNED NOT NULL,
DateMutation DATETIME NOT NULL,
ValeurFonciere INT UNSIGNED NOT NULL,
Bien_ID SMALLINT UNSIGNED NOT NULL,
PRIMARY KEY (Mutation_ID)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

突变数据 示例 区域数据示例

我需要找到平均售价最高的 3 个城市,但只针对少数几个州。

当我使用这个时:

SELECT Departement, Commune, avg(ValeurFonciere) as Prix_Moy
FROM localite, bien, mutation
where mutation.Bien_ID = bien.Bien_ID
And bien.Bien_ID = localite.Commune_ID
AND Departement in (6, 13, 33, 59, 69) 
GROUP BY Commune
ORDER BY Commune DESC
limit 3;

我在所有 5 个部门(即 6、13、33、59、69)中都获得了前 3 名。在法国,每个部门(州)都有自己的识别号码,所以这些号码是我感兴趣的部门。

但是我如何获得每个部门的前 3 名(所以,总共 15 个公社)?

我在这里查看并找到了几个使用带有分区的 rank() 函数的解决方案,但我不知道这是否是正确的解决方案,因为我不能告诉它只查看我需要的 5 个部门。

任何帮助将不胜感激。

标签: mysql

解决方案


推荐阅读