WHERE...IN子句问题:pandasql查询结果行数不符
问题分析与解决方案
为什么返回行数超过800?
你的CTE employee_days_transmitters 确实筛选出了800个唯一的employee_day_transmitter组合,但主查询是从table1中匹配所有符合这些组合且variable='rpv'的行。问题出在:table1中同一个(employeeId, theDate, transmitterId, variable='rpv')组合可能对应多条记录(比如同一个员工同一天使用同一个发射器,有多条rpv相关的日志或数据行),所以匹配后返回的总行数自然会超过800。
如何获取恰好800行数据?
根据你的需求,分两种场景给出解决方案:
场景1:每个唯一组合只保留任意一行
如果你只需要每个employee_day_transmitter组合对应的一行数据(不管具体是哪一行),可以用JOIN替代IN,并配合DISTINCT或者窗口函数来确保每个组合只取一行:
方案A:使用DISTINCT(简单直接)
WITH employee_days_transmitters AS ( SELECT DISTINCT employeeId, theDate, transmitterId, employeeId || '-' || CAST(theDate AS STRING) || '-' || transmitterId AS employee_day_transmitter FROM table1 WHERE variable='rpv' ORDER BY RANDOM() LIMIT 800 ) SELECT DISTINCT t1.* FROM table1 t1 INNER JOIN employee_days_transmitters edt ON t1.employeeId = edt.employeeId AND t1.theDate = edt.theDate AND t1.transmitterId = edt.transmitterId WHERE t1.variable = 'rpv'
这里用等值连接替代字符串匹配,比IN更高效,也避免了字符串拼接可能带来的潜在错误。
方案B:使用窗口函数(更灵活,可指定取哪一行)
如果需要每个组合取特定的一行(比如最新的记录、数值最大的记录),可以用ROW_NUMBER()窗口函数来控制:
WITH employee_days_transmitters AS ( SELECT DISTINCT employeeId, theDate, transmitterId FROM table1 WHERE variable='rpv' ORDER BY RANDOM() LIMIT 800 ), ranked_records AS ( SELECT t1.*, -- 按你需要的规则排序,比如按时间戳降序取最新行 ROW_NUMBER() OVER ( PARTITION BY t1.employeeId, t1.theDate, t1.transmitterId ORDER BY t1.timestamp_column DESC ) AS row_rank FROM table1 t1 INNER JOIN employee_days_transmitters edt ON t1.employeeId = edt.employeeId AND t1.theDate = edt.theDate AND t1.transmitterId = edt.transmitterId WHERE t1.variable = 'rpv' ) SELECT * FROM ranked_records WHERE row_rank = 1
把timestamp_column替换成你实际用来排序的字段,就能精准控制每个组合取哪一行。
场景2:确认CTE的800个组合都被包含,但接受多行
如果你其实需要每个组合的所有行,但只是想验证CTE的800个组合都被匹配到,可以用下面的查询统计每个组合的行数:
WITH employee_days_transmitters AS ( SELECT DISTINCT employeeId, theDate, transmitterId, employeeId || '-' || CAST(theDate AS STRING) || '-' || transmitterId AS employee_day_transmitter FROM table1 WHERE variable='rpv' ORDER BY RANDOM() LIMIT 800 ) SELECT edt.employee_day_transmitter, COUNT(*) AS row_count FROM table1 t1 JOIN employee_days_transmitters edt ON t1.employeeId = edt.employeeId AND t1.theDate = edt.theDate AND t1.transmitterId = edt.transmitterId WHERE t1.variable = 'rpv' GROUP BY edt.employee_day_transmitter
这样就能看到每个组合对应的行数总和,确认是否确实是因为多行导致总记录数超过800。
内容的提问来源于stack exchange,提问作者Eni
相关产品推荐
相关产品推荐

