Postgres SELECT строки плюс следующая строка с критериями - PullRequest
0 голосов
/ 17 декабря 2018

Интересно, кто-нибудь может дать мне несколько подсказок?

У меня есть простой запрос, который выбирает строки на основе нормальных критериев:

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 голосов
/ 17 декабря 2018

Если вы можете принять получение данных, которые вы хотите объединить в те же строки, это может быть простое объединение.

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;

Я бы порекомендовал первый подход, если он соответствует вашим потребностям, потому что он намного проще.

0 голосов
/ 17 декабря 2018

Я бросился задавать вопрос, но затем решил его.

Это можно сделать как 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;

Конечно, если у кого-то есть идеи получше, я быбудь счастлив услышать их.

...