如何查询同一日期同一Code下TWS不同的数据行?
问题分析
你原SQL的问题在于分组时包含了TWS字段,这会把每个(T_Date, Code, TWS)的组合单独分成一组,每组里的TWS都是唯一的,COUNT(t.TWS)自然永远是1,完全达不到筛选目标数据的效果。
正确的思路是:先找出那些同一T_Date和Code下存在多个不同TWS的组合,再基于这些组合去原表中取出对应的所有行。
解决方案
方法1:子查询+关联
先通过子查询筛选出符合条件的(T_Date, Code)对,再和原表关联获取完整数据:
SELECT t.T_Date, t.Code, t.TWS FROM trades t INNER JOIN ( SELECT T_Date, Code FROM trades GROUP BY T_Date, Code -- 统计同一日期和代码下的不同TWS数量大于1 HAVING COUNT(DISTINCT TWS) > 1 ) AS filtered ON t.T_Date = filtered.T_Date AND t.Code = filtered.Code ORDER BY t.T_Date, t.Code, t.TWS;
方法2:窗口函数(推荐,更高效)
使用窗口函数直接在每行计算当前(T_Date, Code)分组下的不同TWS数量,再筛选出数量大于1的行:
SELECT T_Date, Code, TWS FROM ( SELECT T_Date, Code, TWS, -- 计算当前分组内不同TWS的数量 COUNT(DISTINCT TWS) OVER(PARTITION BY T_Date, Code) AS tws_count FROM trades ) AS temp WHERE tws_count > 1 ORDER BY T_Date, Code, TWS;
验证结果
执行上述任意一种SQL,都会得到你期望的结果:
T_Date | Code | TWS 2018-01-01 | A0001 | TRDR001 2018-01-01 | A0001 | TRDR002 2018-01-05 | A0006 | TRDR001 2018-01-05 | A0006 | TRDR003
内容的提问来源于stack exchange,提问作者Abdullah-Al-Nahian
相关产品推荐
相关产品推荐

