如何在MySQL 8(如MSSQL)上将表达式用作LAG()第二个参数?

我正在尝试迁移此SQL SERVER查询:

SELECT year,sales,LAG(year-2,2*(SELECT MIN(sales) FROM product_sales),sales/2.0 ) OVER (ORDER BY year) AS no_sense  
FROM product_sales;

dbfiddle link

对于 MySQL 8 (相同的查询):

dbfiddle link

不幸的是我遇到了这个错误:

  

您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本以使用正确的语法   接近'*(SELECT MIN(sales)FROM product_sales),sales / 2.0)OVER(ORDER   按年)在第2行输入AS no _'

是否可以将该查询“移植”到mysql?

谢谢!

wokun688 回答:如何在MySQL 8(如MSSQL)上将表达式用作LAG()第二个参数?

这是因为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

大家都在问