请求协助编写SQLite查询:判断同Well内Band A与Band B的ng值关系
问题与解决方案
需求说明
给定如下数据表:
df = pd.DataFrame({'Well': ['A', 'A', 'B', 'B'], 'BP': [380., 25., 24., 360.], 'ng': [1., 10., 1., 10.], 'Band A': [True, False, False, True], 'Band B': [False, True, True, False]})
需要编写SQL查询,实现:同一Well分组内,当Band A为True时,若其对应的ng值大于该Well内Band B对应的ng值,则返回True,否则返回False。
原查询问题分析
你之前的查询失败原因是:子查询SELECT ng FROM df WHERE Band_B = True没有关联当前行的Well字段,会返回所有Band B为True的ng值(而非同一Well下的),导致比较逻辑错误。
正确查询方案
方案1:自连接匹配同一Well的Band B记录
通过自连接将同一Well下的Band A和Band B记录关联,直接进行值比较:
sqlcmd = ''' SELECT a.Well, a.ng, CASE WHEN a.`Band A` = True AND a.ng > b.ng THEN 'True' ELSE 'False' END AS Duplicate FROM df a LEFT JOIN df b ON a.Well = b.Well AND b.`Band B` = True ORDER BY a.Well; ''' pp.pprint(pysqldf(sqlcmd).head())
方案2:窗口函数获取分组内的Band B ng值
用窗口函数按Well分组,提取每个Well中Band B对应的ng值,再进行比较:
sqlcmd = ''' SELECT Well, ng, CASE WHEN `Band A` = True AND ng > MAX(CASE WHEN `Band B` = True THEN ng END) OVER (PARTITION BY Well) THEN 'True' ELSE 'False' END AS Duplicate FROM df ORDER BY Well; ''' pp.pprint(pysqldf(sqlcmd).head())
结果说明
执行上述查询后,会得到如下结果:
| Well | ng | Duplicate |
|---|---|---|
| A | 1.0 | False |
| A | 10.0 | False |
| B | 1.0 | False |
| B | 10.0 | True |
内容的提问来源于stack exchange,提问作者Lewis
相关产品推荐
相关产品推荐

