如何从 sql 中的另一行获取值
How to get value from another row in sql
我有一个 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
我想添加一个新列,这样对于我们在 previous_customer_leg1
中发现的每个 customer_leg1
,它应该将该行的 "end_date"
放在该列中。
例如:在上面输出的第 1 行中 customer_leg1
是 4092
并且在 previous_customer_leg1
的第 2 行中找到了它,所以在第 1 行中,这个 new_column
里面应该有 05/08/17
。对于那些 customer_leg1 在 previous_customer_leg1 中不匹配的情况,它应该为 NULL。我想我可以为此使用分区和滞后函数,但我对这些不是很清楚。任何帮助将不胜感激。谢谢!
由于您只展示了 "the gist" 您想要的内容,也许 "the gist" 一种可能的解决方案是这样的:
将另一个连接添加到您的 "really huge" 查询:
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
..................
正如我在评论中询问的那样,您将确保正确显示 next row
的列是什么,因为您不能保证您的输出始终按相同的顺序排列。因此,假设 order
的列是 creation_date
,并且您希望在 c.cid
的 partition
上完成此操作,您可以在 [=16] 中添加如下内容=] 语句来派生这个新列,而不会影响查询的其余部分。
免责声明:如果 partition
和 order
的列不同,则此方法无效。请更改列。但是下面是 读取下一列的概念,如果匹配,则显示下一行的另一列 。
,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 查询,如下所示:
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
我想添加一个新列,这样对于我们在 previous_customer_leg1
中发现的每个 customer_leg1
,它应该将该行的 "end_date"
放在该列中。
例如:在上面输出的第 1 行中 customer_leg1
是 4092
并且在 previous_customer_leg1
的第 2 行中找到了它,所以在第 1 行中,这个 new_column
里面应该有 05/08/17
。对于那些 customer_leg1 在 previous_customer_leg1 中不匹配的情况,它应该为 NULL。我想我可以为此使用分区和滞后函数,但我对这些不是很清楚。任何帮助将不胜感激。谢谢!
由于您只展示了 "the gist" 您想要的内容,也许 "the gist" 一种可能的解决方案是这样的:
将另一个连接添加到您的 "really huge" 查询:
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
..................
正如我在评论中询问的那样,您将确保正确显示 next row
的列是什么,因为您不能保证您的输出始终按相同的顺序排列。因此,假设 order
的列是 creation_date
,并且您希望在 c.cid
的 partition
上完成此操作,您可以在 [=16] 中添加如下内容=] 语句来派生这个新列,而不会影响查询的其余部分。
免责声明:如果 partition
和 order
的列不同,则此方法无效。请更改列。但是下面是 读取下一列的概念,如果匹配,则显示下一行的另一列 。
,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