根据月份差异拆分记录

时间:2019-10-24 08:00:18

标签: sql apache-spark-sql

我需要生成行,每个月有1行,发生在两个给定日期之间。 考虑以下表格: plcy:

plcy_no | plcy_strt_dt | plcy_end_dt
12345 | 10/01/2019 | 15/04/2019
24365 | 04/05/2019 | 22/07/2019

对于每个策略,要求将记录分成行数,该行数等于plcy_strt_dt & plcy_end_dt之间发生的月数。

因此,考虑样本数据(上方)plcy = 12345的开始日期在Jan 2019中,结束日期在Apr 2019中。因此,该记录需要分为5条记录,这5条记录需要在这两个记录之间的每个月(即Jan, Feb, Mar, Apr)中生成,并按如下所示填充开始日期和结束日期。

预期输出:

plcy_no | plcy_strt_dt | plcy_end_dt
12345 | 10/01/2019 | 31/01/2019
12345 | 01/02/2019 | 28/02/2019
12345 | 01/03/2019 | 31/04/2019
12345 | 01/04/2019 | 15/04/2019
24365 | 04/05/2019 | 31/05/2019
24365 | 01/06/2019 | 30/06/2019
24365 | 01/07/2019 | 22/07/2019

非常感谢您的帮助。如果需要其他信息,请告诉我。 我只能使用Spark-SQL。

谢谢

1 个答案:

答案 0 :(得分:0)

  

Spark2.4 +使用spark SQL尝试

scala>  var df = Seq(("12345","10-01-2019","15-04-2019"),("24365","04-05-2019","22-07-2019")).toDF("plcy_no","plcy_strt_dt","plcy_end_dt")
scala> df.registerTempTable("temp")

这里我正在使用序列函数来生成日期

scala> sql("select *,last_day(CAST(start_date AS DATE)) end_date from (SELECT plcy_no,explode(sequence(to_date(plcy_strt_dt,'dd-MM-yyyy'), to_date(plcy_end_dt,'dd-MM-yyyy'), interval 1 month)) as start_date from temp)t").show()

+-------+----------+----------+
|plcy_no|start_date|  end_date|
+-------+----------+----------+
|  12345|2019-01-10|2019-01-31|
|  12345|2019-02-10|2019-02-28|
|  12345|2019-03-10|2019-03-31|
|  12345|2019-04-10|2019-04-30|
|  24365|2019-05-04|2019-05-31|
|  24365|2019-06-04|2019-06-30|
|  24365|2019-07-04|2019-07-31|
+-------+----------+----------+

希望这会有所帮助。