如何用SQL查询跨月份CSNA值发生变化的行与ID
解决月度表CSNA值变化的查询问题
你之前的查询没有指定jan_data和feb_data的关联条件(比如通过ID匹配),数据库执行了笛卡尔积——把jan_data的每一行和feb_data的每一行强制组合,结果行数自然远大于单表行数,这就是问题根源。
正确查询逻辑(以jan到feb为例)
1. 查找ID在两表都存在且CSNA变化的行
如果只关注已有ID的CSNA变动,用INNER JOIN关联同ID行,再筛选CSNA不同的记录:
SELECT f.ID, j.CSNA AS jan_CSNA, f.CSNA AS feb_CSNA FROM feb_data f INNER JOIN jan_data j ON f.ID = j.ID WHERE j.CSNA <> f.CSNA;
这个查询会返回你示例中的1234770286和1234770331这两个ID的变动记录。
2. 包含月度新增行的完整变化查询
如果需要同时统计feb新增的ID(jan中无对应记录),用LEFT JOIN以feb表为主表,关联jan表后筛选变化或新增的记录:
SELECT f.ID, j.DATE AS jan_date, j.CSNA AS jan_CSNA, f.DATE AS feb_date, f.CSNA AS feb_CSNA FROM feb_data f LEFT JOIN jan_data j ON f.ID = j.ID WHERE -- 已有ID的CSNA变化(含NULL值情况) (j.CSNA <> f.CSNA OR j.CSNA IS NULL OR f.CSNA IS NULL) -- 或feb新增的ID OR j.ID IS NULL;
扩展到feb到mar的查询
只需替换表名,逻辑完全一致:
SELECT m.ID, f.CSNA AS feb_CSNA, m.CSNA AS mar_CSNA FROM mar_data m INNER JOIN feb_data f ON m.ID = f.ID WHERE f.CSNA <> m.CSNA;
注意事项
- 确保
ID是每行的唯一标识,否则关联会出现错误匹配。 - 若
CSNA字段可能为NULL,必须单独加入IS NULL的判断,因为NULL与任何值的比较结果都是NULL,不会被WHERE条件命中。
内容的提问来源于stack exchange,提问作者jpc31999
相关产品推荐
相关产品推荐

