用新产品替换所有旧产品值的SQL逻辑

时间:2018-10-24 16:40:14

标签: sql amazon-redshift

我需要建立逻辑,以便根据相关的先前版本用新产品名称替换所有旧产品名称。 这是数据和表格的样子。我有三列分别名为product_name,Intro_date和previous_product_name。

当前表:

product_name | Intro_date | previous_product_name
-------------------------------------------------

PRO01              6/1/2016 
PRO02              6/15/2016    
PRO03              6/15/2016    PRO02
PRO04              6/15/2016    PRO01
PRO05              8/1/2016
PRO06              9/1/2016     PRO04
PRO07              9/1/2016     PRO05
PRO08              10/15/2016   PRO06
PRO09              10/15/2016   PRO07

现在,我想创建新的列名“ product_name_mapping”,并且需要像下面的输出一样填充数据值。

示例:如果您查看PRO09的先前产品名称是PRO07。就像同一PRO07的先前产品名称是PRO05…一样。

映射如下:PRO05> PRO07> PRO09

现在,我要用新产品名称值PRO09替换所有以前的产品名称值PRO05,PRO07。

类似于PRO08:PRO01> PRO04> PRO06> PRO08

我要用PRO08替换所有以前的产品名称(PRO01> PRO04> PRO06)。

这就是我要寻找的最终结果。

结果表:

product_name | Intro_date | previous_product_name | product_name_mapping
------------------------------------------------------------------------

*PRO01             6/1/2016                              PRO08
PRO02              6/15/2016                             PRO03
PRO03              6/15/2016    PRO02                    PRO03
PRO04              6/15/2016    PRO01                    PRO08
PRO05              8/1/2016                              PRO09
PRO06              9/1/2016     PRO04                    PRO08
PRO07              9/1/2016     PRO05                    PRO09
PRO08              10/15/2016   PRO06                    PRO08
PRO09              10/15/2016   PRO07                    PRO09

我尝试了构建逻辑,但是没有运气。我需要在AWS Redshift数据库中构建此SQL。 谁能帮我解决这个问题?

1 个答案:

答案 0 :(得分:0)

您将需要创建一个带有一段时间的函数来遍历并获取当前项。然后,您可以在查询中使用该函数。我使用SQL Server,但也许您可以将其转换为AWS Redshift。

功能

CREATE FUNCTION [guest].[get_mapping]( @product_name AS Varchar(256) )
RETURNS Varchar(256)
AS BEGIN 
    while (@@rowcount > 0)
    BEGIN
        select @product_name = product_name from <YourTable> where previous_product_name = @product_name;
    END
    RETURN @product_name; 
END

选择语句:

select *, get_mapping(product_name) as product_name_mapping from <yourtable>