请教SQL查询:按要求求和tiv_2012并解决(lat,lon)唯一判断问题
没问题,我来帮你搞定这个SQL查询的问题!
要满足你说的两个条件,我们可以通过两种实用的思路来实现,我都给你列出来:
方法一:用窗口函数(高效推荐)
窗口函数能在一次表扫描中完成两个条件的统计,性能更优。具体SQL如下:
SELECT ROUND(SUM(tiv_2012), 2) AS tiv_2012 FROM ( SELECT tiv_2012, -- 统计当前tiv_2011值在表中出现的总次数 COUNT(*) OVER (PARTITION BY tiv_2011) AS cnt_tiv2011, -- 统计当前(lat, lon)组合出现的总次数 COUNT(*) OVER (PARTITION BY lat, lon) AS cnt_coords FROM insurance ) AS sub_query -- 筛选出tiv_2011至少出现2次,且坐标唯一的记录 WHERE cnt_tiv2011 >= 2 AND cnt_coords = 1;
方法二:用分组子查询(逻辑直观)
如果对窗口函数不太熟悉,也可以用分组查询先圈出符合条件的tiv_2011和坐标,再筛选求和:
SELECT ROUND(SUM(tiv_2012), 2) AS tiv_2012 FROM insurance WHERE -- 筛选tiv_2011值存在至少一个其他投保人相同的记录 tiv_2011 IN ( SELECT tiv_2011 FROM insurance GROUP BY tiv_2011 HAVING COUNT(*) >= 2 ) -- 筛选坐标唯一的记录 AND (lat, lon) IN ( SELECT lat, lon FROM insurance GROUP BY lat, lon HAVING COUNT(*) = 1 );
补充提醒:
ROUND(SUM(tiv_2012), 2)用来对求和结果保留两位小数,ROUND是MySQL、PostgreSQL、SQL Server等大多数数据库都支持的函数。- 如果
lat和lon是浮点型字段,可能存在精度误差导致本该相同的坐标被误判为不同。遇到这种情况,可以考虑对坐标做四舍五入后再分组,比如ROUND(lat, 4)和ROUND(lon, 4),具体精度根据你的数据情况调整。
内容的提问来源于stack exchange,提问作者Srishti Sinha
相关产品推荐
相关产品推荐

