Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 比较记录并生成记录_Sql_Apache Spark Sql_Pyspark Sql - Fatal编程技术网

Sql 比较记录并生成记录

Sql 比较记录并生成记录,sql,apache-spark-sql,pyspark-sql,Sql,Apache Spark Sql,Pyspark Sql,我的要求是按时间顺序排列记录,并按顺序将每个记录与其下一个记录进行比较。如果第二条记录与asc顺序中与任何字段相关的前一条记录不同,且该记录处于活动状态,即标志='F',则通过生成第二条记录的eff_日期=eff_dt的记录-1天来拆分第二条记录。如果下一条记录处于非活动状态,即e标志='C',则只输出该记录,而无需拆分和创建新记录 继续对所有记录进行此比较 例如 product | eff_dt | store | region | type 12345 | 18/05/2017 | HA |

我的要求是按时间顺序排列记录,并按顺序将每个记录与其下一个记录进行比较。如果第二条记录与asc顺序中与任何字段相关的前一条记录不同,且该记录处于活动状态,即标志='F',则通过生成第二条记录的eff_日期=eff_dt的记录-1天来拆分第二条记录。如果下一条记录处于非活动状态,即e标志='C',则只输出该记录,而无需拆分和创建新记录 继续对所有记录进行此比较

例如

product | eff_dt | store | region | type
12345 | 18/05/2017 | HA | CA | F
12345 | 05/10/2018 | K1 | CA | F
12345 | 01/02/2019 | K1 | CA | F
12345 | 15/07/2019 | AB | GA | C
12345 | 07/09/2019 | BT | MD | F
从上表中,我们首先按时间顺序排列记录。 现在,我们将第一条记录与第二条记录进行比较,发现第二条记录HA->K1中的存储已更改,第二条记录为active flag=F。因此,输出需要第一条记录和第二条记录,第二条记录将分为两部分-使用eff_dt-1天创建一条新记录。 现在,当我们比较第三条记录和第二条记录时,我们看到任何字段的值都没有变化,而且该记录是活动的,因此该记录将被忽略,不会被输出。 现在我们将第四条记录与第三条记录进行比较,我们看到它是非活动的标志='C',因此,该记录将按原样输出,但不会像第一个场景那样生成新记录。 最后,发现第5条记录是在第4条记录中关闭产品后的第一条活动记录,因此也将输出,但不会创建新记录

预期产出将是:

product | eff_dt | store | region | type
12345 | 18/05/2017 | HA | CA | F      <<--- output
12345 | 04/10/2017 | HA | CA | F      <<--- new record generated with (eff_dt - 1)
12345 | 05/10/2018 | K1 | CA | F      <<--- output as-is
                                           <<--- record not output since no change in values
12345 | 15/07/2019 | AB | GA | C      <<--- record has changes but also Inactive. Hence, output as-is and new record generation not required
12345 | 07/09/2019 | BT | MD | F      <<--- record output since this indicates product is reopened and is active again. No new record required.
任何人都可以帮助上面的逻辑,以及如何通过使用eff_dt-1创建新记录来分割记录。
请告诉我是否需要额外的信息/澄清

Hmmm。我将此解释为带有一些曲折的缺口和岛屿问题。我不会将结束值放在不同的行上,而是将生效日期和结束日期放在一行上:

select product, store, region, type,
       min(eff_dt),
       date_add(lead(eff_dt) over (partition by product order by min(eff_dt), -1) as
from (select t.*,
             row_number() over (partition by product order by eff_dt) as seqnum_p,
             row_number() over (partition by product, store, region, type order by eff_dt) as seqnum_psrt
      from t
     ) t
group by product, store, region, type, (seqnum - seqnum_psrt);
如果要在不同的行上执行此操作,可以使用union all:


这里查找具有相同值的行的诀窍是比较上一个/下一个日期-但按数据的不同分区。这比单独比较每一列更简单,也适用于空值。

每行有六个值,但只有五个列标题。@marie20。第一种情况并非如此。第二个应该。该代码是否使用下一个记录的eff_dt-1创建新行?您的解决方案是否也考虑了活动/非活动状态?列类型是标志:F=活动,C=inactive@marie20 . . . 它正在考虑分区/分组列表中的任何列。我发现一篇帖子非常符合我的要求。这可以用SparkSQL而不是pyspark sql实现吗?我将简化需求并创建一个新问题
select product, store, region, type, eff_dt
from (select t.*,
             lag(eff_dt) over (partition by product, store, region, type order by eff_dt) as prev_psrt_date,
             lag(eff_dt) over (partition by product order by eff_dt) as prev_date
      from t
     ) t
where prev_date is null or prev_date <> prev_psrt_date
union all
select product, store, region, type,
       date_add(next_date, 1)
from (select t.*,
             lead(eff_dt) over (partition by product, store, region, type order by eff_dt) as next_psrt_date,
             lead(eff_dt) over (partition by product order by eff_dt) as next_date
      from t
     ) t
where next_date <> next_psrt_date or next_psrt_date is null;