我有一个sql视图sayemp_table如下所示:

+----------+----------+------+
| actor_id | movie_id | year |
+----------+----------+------+
|        2 |   280088 | 2002 |
|        2 |   396232 | 2000 |
|        3 |   376687 | 2000 |
|        4 |   336265 | 2001 |
|        5 |   135644 | 1953 |
|        6 |    12083 | 1996 |
|        7 |   252053 | 1993 |
|        7 |   402635 | 1992 |
|        7 |   409592 | 1995 |
|        8 |   101866 | 2000 |
|        9 |   336265 | 2001 |
|       10 |    12148 | 2000 |
|       11 |    80189 | 2001 |
|       12 |    12148 | 2000 |
|       13 |    80189 | 2001 |
|       14 |    70079 | 1982 |
|       15 |    12148 | 2000 |
|       16 |   242675 | 1991 |
|       17 |   105231 | 1993 |
|       17 |   242453 | 1988 |
+----------+----------+------+

... 等等。我需要找到所有从未有过3年以上职业差距的人。这意味着我需要计算所有的演员,如果我计算出他们在电影中扮演的独特年份的数量,然后排序,那么一年中最大的连续差异永远不会超过3年。
请帮助我进行此sql查询。我试过sql self-join,但想不起了。
所有的SQL代码都只针对MySQL。
请注意,您可以考虑只有一个演员id和电影id的组合。
预期结果
+----------+----------+
| actor_id | max_gap  |
+----------+----------+
|        2 |   2      |
|        3 |   0      |
|        4 |   0      |
|        5 |   0      |
|        6 |   0      |
|        7 |   2      |
|        . |   .      |
|        . |   .      |
|        . |   .      |
|       17 |   5      |
+----------+----------+

等等
注2:很抱歉输出中有这么多更改。这是最后一个版本,以后不再更改。

最佳答案

使用MySQL 8和MariaDB 10.2,您可以使用window函数LEAD()为演员获取下一个连续播放年(或LAG()为最后一个)。然后只需要在外部查询中获得最大差异。

with tmp as (
  select
      actor_id,
      year,
      lead(year) over (partition by actor_id order by year) as year_lead
  from emp_table e
)
select actor_id, coalesce(max(year_lead - year), 0) as max_gap
from tmp
group by actor_id
having max_gap <= 3;

演示:https://www.db-fiddle.com/f/cWChT2TqLuRT8bW1zcM9G2/0

07-25 22:49