如何从sql中的另一行获取值

如何从sql中的另一行获取值,sql,oracle,lag,window-functions,Sql,Oracle,Lag,Window Functions,我有一个sql查询,如下所示: select ,c.customer_leg1 ,d.mid ,c.previous_customer_leg1 ,c.creation_date ,c.end_date ,c.cid from table1 c JOIN table2 d ON c.cid = d.cid where c.cid = '1234' 它给出了以下输出: customer_l

我有一个sql查询,如下所示:

    select 

    ,c.customer_leg1
,d.mid
        ,c.previous_customer_leg1  
        ,c.creation_date
    ,c.end_date
    ,c.cid

    from table1 c

    JOIN table2 d
    ON c.cid = d.cid
    where c.cid = '1234'
它给出了以下输出:

customer_leg1 | previous_customer_leg1 | creation_data | end_date | cid
4092          | 1888                   | 05/06/17      | 05/07/17 | 735
8915          | 4092                   | 05/06/17      | 05/08/17 | 735
我想添加一个新列,以便对于每个
客户_leg1
我们在
以前的客户_leg1
中发现的位置,它应该将该行的
“结束日期”
放在该列中


例如:在上述输出的第1行中,
customer\u leg1
4092
,这在
以前的客户leg1
的第2行中找到,因此在第1行中,这个
新列
应该包含
05/08/17
。对于那些,如果customer_leg1与前面的_customer_leg1不匹配,则应该为NULL。我想我可以使用分区和滞后函数,但我不太清楚。任何帮助都将不胜感激。谢谢

既然你只是展示你想要的东西的“要点”,那么一个可能的解决方案的“要点”可能是这样的:

在“真正庞大”的查询中添加另一个加入:

select .....
     , c1.end_date as new_column
from   table1 c join table2 d   on c.cid = d.cid
                join talbe1 c1  on c.cid           = c1.cid 
                               and c.customer_leg1 = c1.previous_customer_leg1
..................

正如我在评论中所问的,哪些列可以确保下一行的
正确显示,因为您不能保证输出总是以相同的顺序显示。因此,假设您的
order
列是
creation\u date
,并且您希望在
c.cid
分区上执行此操作,您可以在
select
语句中添加如下内容以派生此新列,而不会干扰查询的其余部分

免责声明:如果
分区
顺序
的列不相同,则这将不起作用。请更改列。但是,为一列读取下一行,如果匹配,则显示下一行中的另一列的概念如下

,CASE
    WHEN lead (c.previous_customer_leg1,1) 
            over (partition BY c.cid  ORDER BY c.creation_date) 
         = c.customer_leg1 
    THEN lead (c.end_date,1) over (partition BY c.cid ORDER BY c.creation_date)
END AS new_column

你一点也不亲近。为什么您认为您需要
lag()
分区
?您需要的是自联接,而不是分析函数。最好只是陈述你的问题(就像你做的那样);不要在你的问题陈述中包括如何解决它。(你没有,你只是通过你给出的标题给人一种印象。)你发布的查询没有多大意义。您选择的所有列都来自
表1
,而
中的
条件也都基于同一个表,为什么要加入
表2
?因为实际的查询非常庞大,这只是我所说的要点want@Arman-数据顺序的标准是什么。我的意思是,决定两个给定行的输出顺序是相同的?行的顺序没有标准。为什么还要在c.cid=c1.cid上加入它?我假设cid可能是表的主键,customer_leg1(etc)只是一个属性,它可能会在表中出现多次。如果是,则不希望将一个cid中的customer_leg1与另一个cid中的前一个_customer_leg1关联起来。当然,我的假设可能是错误的,但请记住,这只是一个比原来更大的查询的要点。如果你想要一个更仔细、更详细的答案,你需要问一个更仔细、更详细的问题