mysql查询从最新观察返回第n个延迟

biswetbf  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(277)

我有下表:

  1. firm | Sales | year
  2. A | 100 | 2018
  3. A | 200 | 2017
  4. A | 300 | 2016
  5. B | 400 | 2017
  6. B | 500 | 2016
  7. B | 600 | 2015
  8. C | 700 | 2016
  9. C | 800 | 2015
  10. C | 900 | 2014

我正在尝试编写mysql查询,它将为每个组(公司)返回上一次观察(sales)或上一次观察的n个延迟。
我发现mysql query可以返回每个组的最后一次观察结果:

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

但我不知道如何修改代码以返回一个来自最新观察的延迟,即:

  1. firm | Sales | year
  2. A | 200 | 2017
  3. B | 500 | 2016
  4. C | 800 | 2015
wxclj1h5

wxclj1h51#

通过mysql 8中引入的窗口函数使用lag会更容易

u3r8eeie

u3r8eeie2#

我认为最常用的方法是使用变量枚举值:

  1. select t.*
  2. from (select t.*,
  3. (@rn := if(@f = t.firm, @rn + 1,
  4. if(@f := t.firm, 1, 1)
  5. )
  6. ) as rn
  7. from mytable t cross join
  8. (select @f := '', @rn := 0) params
  9. order by t.firm, t.year desc
  10. ) t
  11. where rn = 2;

您的版本有一个致命的缺陷:它正在使用 group byselect * . 在select中有未聚合的列不是 group by 钥匙。这是一个坏sql,几乎在任何数据库中都会失败,并且使用mysql最新版本中的默认设置。
如果意图是“n”是最近一年之前的年数(被1抵消),那么join可以工作:

  1. select t.*
  2. from mytable t join
  3. (select firm, max(year) as max_year
  4. from mytable
  5. group by firm
  6. ) f
  7. on t.firm = f.firm and t.year = f.max_year - (2 - 1);
展开查看全部

相关问题