Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle LEAD-返回下一个匹配的列值_Sql_Oracle_Oracle11g_Lead - Fatal编程技术网

Sql Oracle LEAD-返回下一个匹配的列值

Sql Oracle LEAD-返回下一个匹配的列值,sql,oracle,oracle11g,lead,Sql,Oracle,Oracle11g,Lead,我在一个表中有以下数据 我想从out列中获取下一个out数据。所以在下面的查询中使用了LEAD函数 SELECT ROW_NUMBER,TIMESTAMP,IN,OUT,LEAD(OUT) OVER (PARTITION BY NULL ORDER BY TIMESTAMP) AS NEXT_OUT FROM MYTABLE; 下一列给出的数据如下所示 但我需要知道匹配的下一列值,就像所需的列一样。请让我知道如何在Oracle LEAD功能中实现这一点 谢谢在“输入”和“输出”中枚举,并

我在一个表中有以下数据

我想从out列中获取下一个out数据。所以在下面的查询中使用了LEAD函数

SELECT ROW_NUMBER,TIMESTAMP,IN,OUT,LEAD(OUT) OVER (PARTITION BY NULL ORDER BY TIMESTAMP) AS NEXT_OUT 
FROM MYTABLE;
下一列给出的数据如下所示

但我需要知道匹配的下一列值,就像所需的列一样。请让我知道如何在Oracle LEAD功能中实现这一点

谢谢

在“输入”和“输出”中枚举,并使用该信息进行匹配

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;
在“输入”和“输出”中枚举,并使用该信息进行匹配

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;

将行号分别分配给所有输入和输出,通过将结果放在一列中对结果进行排序,并计算潜在客户:

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

将行号分别分配给所有输入和输出,将结果放在一列中进行排序,并计算潜在客户:

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

谢谢@Gordon。这是可行的,但是ques中显示的数据是来自一个表的虚拟数据,这个表的大小将非常大。我们不能用left join访问表两次。@usersam。我建议你先试试这个,然后马上拒绝回答。谢谢@Gordon。这是可行的,但是ques中显示的数据是来自一个表的虚拟数据,这个表的大小将非常大。我们不能用left join访问表两次。@usersam。我建议您在立即拒绝答案之前尝试此方法。
忽略空值
???忽略空值可能适用于第3行,但不适用于第4行。
忽略空值
???忽略空值可能适用于第3行,但不适用于第4行。谢谢@Salman。这适用于(按合并顺序(rn1,rn2),rn1)。如果插入一个OUT记录而不插入IN,如何注意插入t(“行数”、“时间戳”、“IN”、“OUT”)值(0,100,NULL,'100')。我在表中也有一些损坏的数据。“in”行应该放在“out”之前,所以
,r1为null LAST
是正确的。回复:坏数据。。。我不知道,但它可能需要不同的逻辑;超前/滞后可能无法处理。谢谢@Salman。这适用于(按合并顺序(rn1,rn2),rn1)。如果插入一个OUT记录而不插入IN,如何注意插入t(“行数”、“时间戳”、“IN”、“OUT”)值(0,100,NULL,'100')。我在表中也有一些损坏的数据。“in”行应该放在“out”之前,所以
,r1为null LAST
是正确的。回复:坏数据。。。我不知道,但它可能需要不同的逻辑;超前/滞后可能无法处理。