Oracle LEAD - вернуть значение следующего соответствующего столбца - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть данные ниже в одной таблице.

enter image description here

И я хочу получить СЛЕДУЮЩИЕ данные из столбца OUT.Так что использовала функцию LEAD в запросе ниже.

SELECT ROW_NUMBER,TIMESTAMP,IN,OUT,LEAD(OUT) OVER (PARTITION BY NULL ORDER BY TIMESTAMP) AS NEXT_OUT 
FROM MYTABLE;

Это дает данные, как показано ниже столбца NEXT_OUT.

enter image description here

Но мне нужнознать соответствующее значение следующего столбца последовательно, как столбцы DESIRED.Пожалуйста, дайте мне знать, как я могу добиться этого в Oracle LEAD FUNCTION

СПАСИБО

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Назначьте номер строки всем входам и выходам по отдельности, отсортируйте результаты, поместив их в один столбец, и рассчитайте LEAD:

WITH cte AS (
    SELECT t.*
         , CASE WHEN "IN"  IS NOT NULL THEN COUNT("IN")  OVER (ORDER BY "TIMESTAMP") END AS rn1
         , CASE WHEN "OUT" IS NOT NULL THEN COUNT("OUT") OVER (ORDER BY "TIMESTAMP") END AS rn2
    FROM t
)
SELECT cte.*
     , LEAD("OUT") OVER (ORDER BY COALESCE(rn1, rn2), rn1 NULLS LAST) AS NEXT_OUT
FROM cte
ORDER BY COALESCE(rn1, rn2), rn1 NULLS LAST

Демонстрация на db <> fiddle

0 голосов
/ 21 февраля 2019

Перечислите "in" и "out" и используйте эту информацию для сопоставления.

select tin.*, tout.out as next_out
from (select t.*,
             count(in) over (order by timestamp) as seqnum_in
      from t
     ) tin left join
      (select t.*,
             count(out) over (order by timestamp) as seqnum_out
      from t
     ) tout
     on tin.in is not null and
        tout.out is not null and
        tin.seqnum_in = tout.seqnum_out;
...