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
与相同item
和year
的第一个month
的值进行比较。
【讨论】:
以上是关于SQL Spark - 组的滞后与第一行的主要内容,如果未能解决你的问题,请参考以下文章