I am trying to migrate this SQL SERVER query:
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;
To MySQL 8 (same query):
Unfortunately I got this error:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘*(SELECT MIN(sales) FROM product_sales), sales/2.0 ) OVER (ORDER BY year) AS no_’ at line 2
Is it possible to “port” this query to mysql?
Thanks in advance !
Advertisement
Answer
Note: this answer is based on the Vignesh Kumar A ‘s answer. So why MySQL 8 does not support that SQL Server syntax is already fully explained in his answer, i choose to not explain it double.
In MySQL 8 you would need to make a dynamic SQL query out of it, as offset param of LAG()
does not support SQL expressions..
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;
Note: FLOOR()
is there to fix 19874.00
not giving a error on the lag function.
Offcource you could rewite that SET @sql := CONCAT("..")
part different, just use the writing style you understand the best.
Result
| 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 |
see demo
This works because PREPARE q FROM @sql;
generates this SQL. (Vignesh Kumar A answer)
SELECT year , sales , LAG(year-2, 19874, sales/2.0 ) OVER (ORDER BY year) AS no_sense FROM product_sales;