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

Posted

技术标签:

【中文标题】如何从sql中的另一行获取值【英文标题】:How to get value from another row in sql 【发布时间】:2017-05-25 22:54:36 【问题描述】:

我有一个如下的 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

我想添加一个新列,以便对于每个customer_leg1,我们发现在previous_customer_leg1 中应该将该行的"end_date" 放在该列中。

例如:在上述输出的第 1 行中,customer_leg14092,这可以在 previous_customer_leg1 的第 2 行中找到,因此在第 1 行中,这个 new_column 应该包含 05/08/17。对于那些 customer_leg1 与 previous_customer_leg1 不匹配的情况,它应该为 NULL。我想我可以为此使用分区和滞后功能,但我对这些不是很清楚。任何帮助将不胜感激。谢谢!

【问题讨论】:

你一点也不亲近。为什么你认为你需要lag()partition?您需要的是自联接,而不是分析功能。最好只是陈述您的问题(就像您所做的那样);不要在问题陈述中包括如何解决它。 (你没有,你只是通过你给的标题来给人这种印象。) 您发布的查询没有多大意义。你选择的所有列都来自table1where的条件也都是基于同一张表的,你为什么要加入table2 因为实际查询非常庞大,而这只是我想要的要点 @Arman - 数据顺序的标准是什么。我的意思是什么决定了 2 个给定的行在输出中的顺序是相同的? 行的顺序没有标准。 【参考方案1】:

由于您只是展示了您想要的“要点”,因此一种可能的解决方案的“要点”可能是这样的:

将另一个联接添加到您的“非常大”的查询中:

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
..................

【讨论】:

你为什么还要加入 c.cid = c1.cid 呢? 我假设 cid 可能是您表的主键,而 customer_leg1 (etc) 只是一个属性,它可能在您的表中出现多次。如果是这样,那么您不想将来自一个 cid 的 customer_leg1 与来自另一个 cid 的 previous_customer_leg1 相关联。当然,我的假设可能是错误的,但请记住,这只是一个比原始查询更大的查询的要点。如果您想要更仔细和详细的答案,则需要提出更仔细和详细的问题。 在这样做时,我收到“列不明确定义”错误【参考方案2】:

正如我在 cmets 中询问的那样,您将确保您的 next row 正确显示在哪些列上,因为您不能保证您的输出将始终保持相同的顺序。因此,假设您的order 列是creation_date,并且您希望在partitionc.cid 上完成此操作,您可以在select 语句中添加类似下面的内容来派生这个新列,而无需打扰其余的查询。

免责声明:如果partitionorder 的列不同,则此方法无效。请更改列。但是读取一列的下一行,如果匹配,则显示下一行的另一列的概念如下。

,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

【讨论】:

以上是关于如何从sql中的另一行获取值的主要内容,如果未能解决你的问题,请参考以下文章

如何从同一数据管道中的另一行获取值?

sql 从MySQL中JSON编码字段中的另一个数组中的数组中获取所有值。

是否可以从我的 MySQL 数据库中的一个表中的一行中获取一个值并插入到同一数据库中的另一个表中?

如何选择(所有)表 1 中的一行,该行具有与表 2 相同的另一行

如何从 SQL 中的另一个表中获取计数?

删除数据库现有记录,同时将值从一行分配给具有唯一值的另一行