如何将当前行与PostgreSQL中的下一行和上一行进行比较?

前端之家收集整理的这篇文章主要介绍了如何将当前行与PostgreSQL中的下一行和上一行进行比较?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道如何在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中使用混合大小写标识符)

猜你在找的Postgre SQL相关文章