Как использовать выражение в качестве второго параметра LAG () в MySQL 8 (например, MSSQL)? - PullRequest
1 голос
/ 06 ноября 2019

Я пытаюсь перенести этот запрос 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

В MySQL 8 (тот же запрос):

ссылка dbfiddle

К сожалению, я получил эту ошибку:

В синтаксисе SQL есть ошибка;проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который можно использовать рядом с '* (ВЫБРАТЬ МИН. (продажи) ОТ product_sales), продажи / 2.0) ПЕРЕВЕРНУТЬСЯ (ЗАКАЗАТЬ ПО года) AS no_' в строке 2

Возможно ли "перенести" этот запрос в mysql?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Примечание: Этот ответ основан на ответе Виньеш Кумара * . Итак, почему 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; 
1 голос
/ 06 ноября 2019

Это потому, что параметр offset в функции LAG. В MYSQL смещение не будет принимать выражение или столбец и будет принимать только положительное число, тогда как MSSQL будет принимать все, кроме отрицательных чисел.

MYSQL

offset - offset - это количество строк назад от текущей строки, из которой можно получить значение. Смещение должно быть нулевым или буквальным целым положительным числом. Если смещение равно нулю, то функция LAG () оценивает выражение для текущей строки. Если вы не укажете смещение, то функция LAG () по умолчанию использует его.

MSQSQL

offset - количество строк, возвращаемых изтекущая строка, из которой можно получить значение. Если не указано, default равно 1. Смещение может быть столбцом, подзапросом или другим выражением , которое оценивается как положительное целое число или может быть неявно преобразовано в bigint. смещение не может быть отрицательным значением или аналитической функцией.

Может быть, вы можете попробовать тот же запрос с максимальным числом.

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

FIDDLE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...