我是SQL的新手,我对使用更高级的查询和函数不满意。
所以,我有1张销售表:
id date seller_name buyer_name
---- ------------ ------------- ------------
1 2015-02-02 null Adrian
1 2013-05-02 null John B
1 2007-11-15 null Chris F
2 2014-07-12 null Jane A
2 2011-06-05 null Ted D
2 2010-08-22 null Maryanne A
3 2015-12-02 null Don P
3 2012-11-07 null Chris T
3 2011-10-02 null James O
我想更新每个ID的seller_name
,方法是将之前销售的buyer_name
作为vendor_name添加到新的销售日期。例如,对于id 1,John B将成为2015-02-02
中的卖方和2013-05-02
中的买方。这有意义吗?
P.S。这是一个完美的案例,表格很大,而且ID不是那么整齐。
答案 0 :(得分:4)
merge into your_table a
using ( select rowid rid,
lead(buyer_name, 1) over (partition by id order by date desc) seller
from your_table
) b
on (a.rowid = b.rid )
when matched then update set a.seller_name= b.seller;
说明:Merge into
语句根据匹配或不匹配的标准执行不同的操作。在这里,您必须合并到您的表中,using
中包含您要采用的新值以及将成为匹配键的rowid。 lead
函数从接下来的n行获取结果,具体取决于您在逗号后指定的数字。在指定要跳转的行数后,您还要指定要使用的部分,在您的情况下,按id
进行分区并按日期排序,这样您就可以获得卖家,即前任买家。希望这有点清除它。
答案 1 :(得分:1)
以下任一查询都可用于执行欲望操作
merge into sandeep24nov16_2 table1
using(select rowid r, lag(buyer_name) over (partition by id order by "DATE" asc) update_value from sandeep24nov16_2 ) table2
on (table1.rowid=table2.r)
when matched then update set table1.seller_name=table2.update_value;
或
merge into sandeep24nov16_2 table1
using(select rowid r, lead(buyer_name) over (partition by id order by "DATE" desc) update_value from sandeep24nov16_2 ) table2
on (table1.rowid=table2.r)
when matched then update set table1.seller_name=table2.update_value;
答案 2 :(得分:0)
select a.*,
lag(buyer_name, 1) over(partition by id order by sale_date) seller_name
from <your_table> a;