You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用MySQL查询2020及2021年都有出售记录的同一房产

MySQL筛选两年均有交易记录的房产方案

我们默认你的房屋出售记录表名为 house_sales,存储交易时间的字段名为 sale_date,如果你的实际表名、字段名不同,替换对应部分即可。

方案1:分组聚合筛选(最简洁,适合仅需获取房产唯一信息的场景)

SELECT number, street, town, county, postcode
FROM house_sales
WHERE YEAR(sale_date) IN (2020, 2021)
GROUP BY number, street, town, county, postcode
HAVING COUNT(DISTINCT YEAR(sale_date)) = 2;

逻辑说明

  • 先过滤出所有2020、2021年的交易记录,减少后续计算量
  • 按你指定的5个房产唯一标识字段分组,每个分组对应同一个房产
  • 最后判断每个分组内是否同时包含2020、2021两个年份的记录,满足条件的即为目标房产

如果需要获取这些房产对应的所有交易明细,可以用子查询配合IN实现:

SELECT *
FROM house_sales
WHERE (number, street, town, county, postcode) IN (
    SELECT number, street, town, county, postcode
    FROM house_sales
    WHERE YEAR(sale_date) IN (2020, 2021)
    GROUP BY number, street, town, county, postcode
    HAVING COUNT(DISTINCT YEAR(sale_date)) = 2
);

方案2:自连接查询(适合需要同时查看两年交易数据的场景)

SELECT DISTINCT 
  h1.number, h1.street, h1.town, h1.county, h1.postcode,
  h1.sale_date AS sale_date_2020, h1.price AS price_2020,
  h2.sale_date AS sale_date_2021, h2.price AS price_2021
FROM house_sales h1
INNER JOIN house_sales h2
  ON h1.number = h2.number
  AND h1.street = h2.street
  AND h1.town = h2.town
  AND h1.county = h2.county
  AND h1.postcode = h2.postcode
  AND YEAR(h1.sale_date) = 2020
  AND YEAR(h2.sale_date) = 2021;

逻辑说明

通过自连接将同一房产的2020年交易记录和2021年交易记录关联,直接在结果中同时展示两年的交易信息,方便做价格等维度的同比分析。

补充说明

如果你的交易日期是字符串类型存储,格式为YYYY-MM-DD,可以把YEAR(sale_date)替换为LEFT(sale_date,4),筛选逻辑完全一致。

内容的提问来源于stack exchange,提问作者Andrew Harris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:18:04