Sql Oracle LEAD-返回下一个匹配的列值
我在一个表中有以下数据 我想从out列中获取下一个out数据。所以在下面的查询中使用了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功能中实现这一点 谢谢在“输入”和“输出”中枚举,并
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
是正确的。回复:坏数据。。。我不知道,但它可能需要不同的逻辑;超前/滞后可能无法处理。