SQL Spark - 组的滞后与第一行

Posted

技术标签:

【中文标题】SQL Spark - 组的滞后与第一行【英文标题】:SQL Spark - Lag vs first row by Group 【发布时间】:2020-09-22 16:12:37 【问题描述】:

我是 SQL 新手,我正在尝试计算平均值之间的差异。 我想为每个项目和年份计算月份之间的差异,但我想总是减去当前平均值 - 今年/项目的第一个月份。 例如,项目 A,2020 年,月份 =3 将有输出 = 0.6,因为 3.7 - 3.1(因为这是该项目第一个月的值) - 这是正确的方法吗?或者延迟功能是错误的解决方案?

到目前为止,我一直在尝试这个,但它计算的是与前一行的差异,而不是总是使用第一个月的行。

SELECT item, 
       year, 
       month,  
       average,
       average - COALESCE(LAG(average,1) OVER(
           PARTITION BY item
           ORDER BY year,`month` ),`average`)
AS difference FROM xxx

表格:

+------+------+-------+---------+--------+
| item | year | month | average | wanted OUTPUT |
+------+------+-------+---------+--------+
| a    | 2020 | 1     | 3.1     | 0      |
+------+------+-------+---------+--------+
| a    | 2020 | 2     | 3.5     | 0.4    |
+------+------+-------+---------+--------+
| a    | 2020 | 3     | 3.7     | 0.6    |
+------+------+-------+---------+--------+
| a    | 2020 | 4     | 4.1     | 1.0    |
+------+------+-------+---------+--------+
| b    | 2020 | 1     | 2.0     | 0      |
+------+------+-------+---------+--------+
| b    | 2020 | 2     | 2.1     | 0.1    |
+------+------+-------+---------+--------+
| b    | 2020 | 3     | 2.5     | 0.5    |
+------+------+-------+---------+--------+
| b    | 2020 | 4     | 4.0     | 2.0    |
+------+------+-------+---------+--------+

【问题讨论】:

【参考方案1】:

如果我没听错的话,你需要窗口函数FIRST_VALUE() 而不是LAG()

SELECT item, 
       year, 
       month,  
       average,
       average - FIRST_VALUE(average) OVER(PARTITION BY item, year ORDER BY month) AS difference 
FROM xxx

这会将每行的average 与相同itemyear 的第一个month 的值进行比较。

【讨论】:

以上是关于SQL Spark - 组的滞后与第一行的主要内容,如果未能解决你的问题,请参考以下文章

动态表格将第一列的数字与第一行的数字相乘

SQL - 使用窗口函数创建滞后变量

如何在 SQL 查询中选择每个组的第一行?

在sql中选择每个组的第一行[重复]

Spark Dataframe - 为特定 KEY 组的 VALUE 更改写入新记录

在Scala中为列表中的每一行获取元组的第一项