在PostgreSQL中,如何获取布尔条件匹配行的前后行及该行?
解决方案:查询目标行及其前后行
要实现查询is_selected=true的行,以及它们的前一行和后一行,可以利用窗口函数或行号关联的方式,以下是两种通用方案(适用于支持窗口函数的数据库,如PostgreSQL、MySQL 8.0+、SQL Server等):
方案一:基于行号关联
先为每行按字母顺序分配行号,再筛选出目标行的行号及其前后行号对应的记录:
WITH numbered_letters AS ( SELECT alphabet_letter, is_selected, ROW_NUMBER() OVER (ORDER BY alphabet_letter) AS rn FROM letters ), selected_rns AS ( SELECT rn FROM numbered_letters WHERE is_selected = true ) SELECT nl.alphabet_letter, nl.is_selected FROM numbered_letters nl JOIN selected_rns sr ON nl.rn IN (sr.rn - 1, sr.rn, sr.rn + 1) ORDER BY nl.rn;
方案二:利用窗口函数判断前后行
通过LAG和LEAD函数获取当前行的前一行、后一行的is_selected值,直接筛选符合条件的行:
SELECT alphabet_letter, is_selected FROM ( SELECT alphabet_letter, is_selected, LAG(is_selected) OVER (ORDER BY alphabet_letter) AS prev_selected, LEAD(is_selected) OVER (ORDER BY alphabet_letter) AS next_selected FROM letters ) sub_query WHERE is_selected = true OR prev_selected = true OR next_selected = true ORDER BY alphabet_letter;
结果验证
执行上述任意语句后,将得到符合预期的结果:
alphabet_letter | is_selected -----------------+------------- C | f D | t E | f H | f I | t J | f
内容的提问来源于stack exchange,提问作者justsomeguy
相关产品推荐
相关产品推荐

