这是因为offset
函数中的LAG
参数。在MYSQL
中,offset不接受表达式或列,并且仅接受正数,而MSSQL
将接受除负数以外的所有数字。
MYSQL
offset
-offset
是从当前行返回值的行数。偏移量必须为零或文字正整数。如果offset为零,则LAG()函数将计算当前行的表达式。如果您未指定偏移量,则LAG()函数默认使用一个。
MSQSQL
offset
-从当前行返回值的行数。如果未指定,则default
为1。偏移量可以是计算为正整数的列,子查询或其他表达式,也可以隐式转换为bigint。 offset不能为负值或解析函数。
也许您可以尝试使用最大数量的相同查询。
SELECT year,sales,LAG(year-2,19874,sales/2.0 ) OVER (ORDER BY year) AS no_sense
FROM product_sales;
FIDDLE
,
注意:该答案基于Vignesh Kumar A的answer。
因此,为什么MySQL 8不支持SQL Server语法已在他的答案中得到了充分解释,所以我选择不对其进行重复解释。
在MySQL 8中,您需要使用它进行动态SQL查询,因为LAG()
的offset参数不支持SQL表达式。
SET @sql = CONCAT("
SELECT
year,",(SELECT FLOOR(MIN(sales)) FROM product_sales),sales/2.0 ) OVER (ORDER BY year) AS no_sense
FROM product_sales;
");
PREPARE q FROM @sql;
EXECUTE q;
注意: FLOOR()
可以解决19874.00
不会给滞后功能带来错误的问题。
当然,您可以重申SET @sql := CONCAT("..")
部分different,只是使用您最了解的写作风格。
结果
| year | sales | no_sense |
| ---- | ----- | -------- |
| 2017 | 55000 | 27500 |
| 2017 | 78000 | 39000 |
| 2017 | 49000 | 24500 |
| 2017 | 32000 | 16000 |
| 2018 | 41000 | 20500 |
| 2018 | 89651 | 44825.5 |
| 2018 | 19874 | 9937 |
| 2018 | 32562 | 16281 |
| 2019 | 87456 | 43728 |
| 2019 | 75000 | 37500 |
| 2019 | 96500 | 48250 |
| 2019 | 85236 | 42618 |
请参阅demo
之所以有效,是因为PREPARE q FROM @sql;
生成了此SQL。 (Vignesh Kumar一个答案)
SELECT
year,sales/2.0 ) OVER (ORDER BY year) AS no_sense
FROM product_sales;
本文链接:https://www.f2er.com/3150843.html