Postgres SELECT行以及具有条件的下一行

时间:2018-12-16 23:04:10

标签: postgresql common-table-expression

我想知道是否有人可以给我一些提示。

我有一个简单的查询,该查询根据正常条件选择行:

SELECT ntl.id,ntl.transaction_date, amount
FROM nominal_transaction_lines ntl
WHERE ntl.courier_information = 468323802;

我想要获得的不仅是这些行,还有下一行(如果下一行) 有特定条件。

例如

SELECT ntl.id,ntl.transaction_date, amount
FROM nominal_transaction_lines ntl
WHERE ntl.description = 'fue@'
AND id = (values of id from first select)+1;

最后的rowset将是两个结果的union

这可以作为cte来完成吗?

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

如果您可以接受将要合并的数据合并到同一行中,那么这可能是简单的联接。

SELECT ntl.id, ntl.transaction_date, ntl.amount, ntl_next.id, ntl_next.transaction_date, ntl_next.amount
FROM nominal_transaction_lines ntl
LEFT OUTER JOIN nominal_transaction_lines ntl_next ON ntl_next.id = ntl.id + 1
WHERE ntl.courier_information = 468323802;

如果您需要将它们放在单独的行中,但在同一结果集中,则可以使用CTE

WITH base AS (
    SELECT ntl.id, ntl.transaction_date, amount
    FROM nominal_transaction_lines ntl
    WHERE ntl.courier_information = 468323802
)
SELECT b.id, b.transaction_date, b.amount
FROM base b

UNION

SELECT ntl_next.id, ntl_next.transaction_date, ntl_next.amount
FROM base b
INNER JOIN nominal_transaction_lines ntl_next on ntl_next.id = b.id + 1;

如果能满足您的需求,我会推荐第一种方法,因为它要简单得多。

答案 1 :(得分:0)

我急着问这个问题,但后来解决了。

它可以作为CTE完成:

WITH 
ntl1 AS(
SELECT ntl.id AS thisrow, ntl.id+1 AS nextrow
FROM nominal_transaction_lines ntl
WHERE ntl.courier_information = 468323802),

ntl2 AS(
SELECT ntl.id,amount
FROM nominal_transaction_lines ntl
JOIN ntl1 ON ntl1.thisrow = ntl.id),

ntl3 AS(
SELECT ntl.id,amount
FROM nominal_transaction_lines ntl
JOIN ntl1 ON ntl1.nextrow = ntl.id
WHERE ntl.line_description LIKE 'Fuel%')

SELECT * FROM ntl2
UNION
SELECT * FROM ntl3;

当然,如果有人有更好的主意,我将很高兴听到他们的声音。