我想知道如何在SQL查询中检索结果,与下一行或上一行进行一些逻辑比较.我使用Postgresql.
例
假设我的数据库中有两个属性(有序位置和随机数),我想要检索偶数之间的奇数.我该怎么做?
真正的用法
我想要找到具有类别NAME(而且这个词不是名字)的另外两个单词之间的单词.排序由句子和位置提供.
编辑
我想知道Postgresql的Window函数是否是这种问题的最佳解决方案,而不是执行查询.我听说过他们,但从未用过.
这是我使用WINDOW功能的解决方案.我使用了滞后和领导功能.两者都从偏移当前行的行中返回一个值.滞后回落,铅在接下来的偏移.
SELECT tokcat.text FROM ( SELECT text,category,chartype,lag(category,1) OVER w as prevIoUsCategory,lead(category,1) OVER w as nextCategory FROM token t,textBlockHasToken tb WHERE tb.tokenId = t.id WINDOW w AS ( PARTITION BY textBlockId,sentence ORDER BY textBlockId,sentence,position ) ) tokcat WHERE 'NAME' = ANY(prevIoUsCategory) AND 'NAME' = ANY(nextCategory) AND 'NAME' <> ANY(category)
简体版本:
SELECT text FROM ( SELECT text,lag(category) OVER w as prevIoUs_cat,lead(category) OVER w as next_cat FROM token t JOIN textblockhastoken tb ON tb.tokenid = t.id WINDOW w AS (PARTITION BY textblockid,sentence ORDER BY position) ) tokcat WHERE category <> 'NAME' AND prevIoUs_cat = 'NAME' AND next_cat = 'NAME';
要点
> = ANY()不需要,窗口函数返回单个值>子查询中的一些冗余字段>不需要按列进行排序,即PARTITION BY – ORDER BY适用于分区>不要使用混合的案例标识符,而不引用,它只会导致混淆. (更好的是:不要在Postgresql中使用混合大小写标识符)