MySQL запрос на возврат n-го лага из последних наблюдений - PullRequest
0 голосов
/ 05 июля 2018

У меня следующая таблица MySQL:

firm | Sales | year
A    | 100   | 2018
A    | 200   | 2017
A    | 300   | 2016
B    | 400   | 2017
B    | 500   | 2016
B    | 600   | 2015
C    | 700   | 2016
C    | 800   | 2015
C    | 900   | 2014

Я пытаюсь написать запрос MySQL, который будет возвращать последнее наблюдение (Продажи) или n-ную задержку от последнего наблюдения для каждой группы (фирмы).

Я нашел запрос MySQL для возврата последнего наблюдения для каждой группы:

select * 
from (select * from mytable order by `Group`, firm, datum desc) x
group by `Group`

но я не знаю, как изменить код так, чтобы он возвращал одну задержку из последнего наблюдения, то есть:

firm | Sales | year
A    | 200   | 2017
B    | 500   | 2016
C    | 800   | 2015

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Было бы проще использовать LAG с оконными функциями, представленными в MySQL 8

0 голосов
/ 05 июля 2018

Я думаю, что наиболее общий метод состоит в том, чтобы перечислить значения с помощью переменных:

select t.*
from (select t.*,
             (@rn := if(@f = t.firm, @rn + 1,
                        if(@f := t.firm, 1, 1)
                       )
             ) as rn
      from mytable t cross join
           (select @f := '', @rn := 0) params
      order by t.firm, t.year desc
     ) t
where rn = 2;

Ваша версия имеет фатальный недостаток: она использует group by с select *. В выборке есть неагрегированные столбцы, которые не являются ключами group by. Это неработающий SQL, который не будет работать практически в любой базе данных и использует настройки по умолчанию в более поздних версиях MySQL.

Если предполагается, что «n» - это число лет до последнего года (ну, смещение на 1), тогда объединения могут работать:

select t.*
from mytable t join
     (select firm, max(year) as max_year
      from mytable
      group by firm
     ) f
     on t.firm = f.firm and t.year = f.max_year - (2 - 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...