Примечание: Этот ответ основан на ответе Виньеш Кумара * . Итак, почему MySQL 8 не поддерживает тот синтаксис SQL Server, который уже полностью объяснен в его ответе, я решил не объяснять его дважды.
В MySQL 8 вам потребуется создать из него динамический запрос SQL, поскольку параметр смещения LAG()
не поддерживает выражения 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;
Примечание: FLOOR()
предназначен для исправления 19874.00
, не выдающего ошибку в функции задержки. Вне источника вы можете перефразировать это SET @sql := CONCAT("..")
part отличается , просто используйте стиль письма, который вы понимаете лучше всего.
Результат
| 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
Это работает, потому что PREPARE q FROM @sql;
генерирует этот SQL. (Виньеш Кумар Ответ)
SELECT
year
, sales
, LAG(year-2, 19874, sales/2.0 ) OVER (ORDER BY year) AS no_sense
FROM product_sales;