PostgreSQL查询需求:筛选主副账户不同且成本含正负值的行
正确的PostgreSQL查询语句
针对你的需求,这里提供两种可行的查询方式:
方式一:使用子查询筛选符合条件的主账户
SELECT * FROM your_table WHERE Master_Account != Sub_Account AND Master_Account IN ( SELECT Master_Account FROM your_table GROUP BY Master_Account -- 筛选出同时存在正Cost和负Cost的主账户 HAVING COUNT(CASE WHEN Cost > 0 THEN 1 END) > 0 AND COUNT(CASE WHEN Cost < 0 THEN 1 END) > 0 );
方式二:使用窗口函数(单表扫描更高效)
SELECT Master_Account, Sub_Account, Cost FROM ( SELECT *, -- 标记当前主账户是否存在正Cost MAX(CASE WHEN Cost > 0 THEN 1 ELSE 0 END) OVER (PARTITION BY Master_Account) AS has_positive, -- 标记当前主账户是否存在负Cost MAX(CASE WHEN Cost < 0 THEN 1 ELSE 0 END) OVER (PARTITION BY Master_Account) AS has_negative FROM your_table WHERE Master_Account != Sub_Account ) filtered WHERE has_positive = 1 AND has_negative = 1;
逻辑说明
你最初的查询语句存在逻辑错误:exists (cost > 0 and cost < 0)是判断单行数据的Cost同时大于0和小于0,这在实际数据中不可能成立,因此无法得到预期结果。正确的逻辑是对每个Master_Account整体判断,确认其下同时存在正、负Cost的子账户,再筛选出其中Master_Account与Sub_Account不同的行。
内容的提问来源于stack exchange,提问作者louieriksson
相关产品推荐
相关产品推荐

