Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySQL 8(如MSSQL)上使用表达式作为LAG()第二个参数?_Mysql_Sql_Sql Server - Fatal编程技术网

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

如何在MySQL 8(如MSSQL)上使用表达式作为LAG()第二个参数?,mysql,sql,sql-server,Mysql,Sql,Sql Server,我正在尝试迁移此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; 要执行相同的查询,请执行以下操作: 不幸的是,我得到了这个错误: 您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 在“*

我正在尝试迁移此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;

要执行相同的查询,请执行以下操作:

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

您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 在“*附近,从product_sales、sales/2.0中选择MINsales,而不是ORDER 按年份,第2行的编号为

是否可以将此查询移植到mysql

提前谢谢

这是因为滞后函数中的偏移参数。在MYSQL中,offset将不接受表达式或列,它只接受正数,而MSSQL将接受除负数以外的所有值

MYSQL

偏移量-偏移量是从当前行返回以获取值的行数。偏移量必须为零或文字正整数。如果偏移量为零,则LAG函数计算当前行的表达式。如果未指定偏移量,则默认情况下,滞后函数使用偏移量

MSQSQL

偏移量—从当前行返回以获取值的行数。如果未指定,则默认值为1。偏移量可以是计算结果为正整数的列、子查询或其他表达式,也可以隐式转换为bigint。偏移量不能为负值或分析函数

可能您可以尝试使用最大数量的相同查询

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

注:此答案基于Vignesh Kumar A的答案。 所以为什么MySQL 8不支持SQL Server语法已经在他的回答中得到了充分解释,我选择不重复解释

在MySQL 8中,您需要对其进行动态SQL查询,因为LAG的offset param不支持SQL表达式

SET @sql = CONCAT("
SELECT
    year
  , sales
  , LAG(year-2,  ",(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;
注:地板用于修复19874.00,不会在滞后功能上出现错误。 当然,你可以重新连接这个集合@sql:=CONCAT。。第二部分,使用你最了解的写作风格

结果

这是因为从@sql准备q;生成此SQL。维涅什·库马尔回答

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

你想完成什么?这在任何数据库中似乎都没有用处。这只是一个增强框架功能的示例,我认为您希望使用滞后功能,但不在窗口功能中。你能描述一下你想计算什么吗/我想从SQLServer得到相同的结果很遗憾,我尝试过使用@variable,但结果是空的:非常感谢!我希望这个问题能帮助人们在MySQL 8更流行的未来几年。我希望这个问题能帮助人们在MySQL 8更流行的未来几年。也许@celsowm仍然是Gordon Linoff的评论你想实现什么?这在任何数据库中似乎都没有用处。你的问题很有道理,这没有多大用处。。
SELECT 
   year  
 , sales  
 , LAG(year-2, 19874, sales/2.0 ) OVER (ORDER BY year) AS no_sense
FROM product_sales;