我有一个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