在sparksql中对每年和每月进行累计求和

webghufk  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(671)

输入:

item    loc    qty    year    month
A       IND     10     2019      13
A       IND     20     2020      1
A       IND     10     2020      2
A       IND     40     2020      3
A       IND     50     2020      5
A       IND     10     2020      6

输出:

item   loc  sum(qty)   year   month
A       IND   0      2019    13
A       IND   10     2020    1
A       IND   30     2020    2
A       IND   40     2020    3
A       IND   50     2020    5
A       IND   90     2020    6

说明:
我将如何得到我的输出如下:
如果我要计算2020年和第3个月,那么我需要考虑(第3个月)和(第1个月)之间的总和(数量),即在这种情况下,它将从2019年第12个月到2020年和第2个月
因此,对于2020年和第3个月,输出将为总和(数量)=10+20+10=40
现在是2020年和第6个月
总和(数量)将介于2020年和第3个月之间=3和2020年和第1个月之间=5
因此,总和(数量)=0(表中未列出的第4个月为0)+40+50=90

u91tlkcl

u91tlkcl1#

试试这个。

df.createOrReplaceTempView("test")

spark.sql("""
    SELECT 
        item,
        loc,
        COALESCE(
            SUM(qty) OVER (
                PARTITION BY item 
                ORDER BY (year - 2000) * 13 + month
                RANGE BETWEEN 3 PRECEDING AND 1 PRECEDING
            ), 0) as sum_qty,
        year,
        month
    FROM 
        test
""").show

+----+---+-------+----+-----+
|item|loc|sum_qty|year|month|
+----+---+-------+----+-----+
|   A|IND|      0|2019|   13|
|   A|IND|     10|2020|    1|
|   A|IND|     30|2020|    2|
|   A|IND|     40|2020|    3|
|   A|IND|     50|2020|    5|
|   A|IND|     90|2020|    6|
+----+---+-------+----+-----+

相关问题