【问题标题】:To find actors who were never unemployed for more than 3 years in a stretch寻找连续3年以上从未失业的演员
【发布时间】:2019-08-30 21:34:14
【问题描述】:

我想一次找到从未失业超过 3 年的演员。 (假设演员在连续两部电影之间保持失业)。

M_cast 代表演员,person 表有演员的名字,movie 表有年份列。

SQL code:

SELECT a.Name, c.year
FROM Person a
Inner Join M_cast b
ON a.PID = b.PID
Inner Join Movie c
ON c.MID = b.MID

这将为我们提供所有演员的姓名和他们工作的不同年份,但是,我不确定如何检查演员是否连续工作了 3 年。感谢您对此的见解。如果在其他任何地方问过类似的问题,请指出正确的方向。

【问题讨论】:

  • 所以你能看到你正在有效地寻找从某个查询中丢失的所有演员
  • 如果您没有 mysql 8 您必须遍历所有按名称和年份排序的所有结果并检查每个演员的年份。您可以在存储过程或 php javasript 等中执行此操作

标签: mysql sql


【解决方案1】:

因此,您已经获得了每部电影的演员、电影(作品)和年份。我的方法是使用LEAD() 函数添加一个新列next_year

函数的一些背景知识:

LEAD() 是一个窗口函数,它提供对位于当前行之后的指定物理偏移处的行的访问。

例如,通过使用 LEAD() 函数,可以从当前行访问下一行的数据,或者下一行之后的行,以此类推。

LEAD() 函数对于比较当前行的值和下一行的值非常有用。

下面显示了 LEAD() 函数的语法:

LEAD(return_value ,offset [,default])
OVER (
    [PARTITION BY partition_expression, ... ]
    ORDER BY sort_expression [ASC | DESC], ...
)

使用示例:

SELECT *
, LEAD(year, 1, 0) OVER (PARTITION BY Name ORDER BY year ASC) AS next_year
FROM (yourJoinedTable)

使用(next_year - year) AS gap,您可以在电影之间创建一列间隔(失业年数)。最后,找到每个演员的 MAX(gap) 并过滤掉 MAX(gap) ≤ 3 的演员。这应该只剩下电影间隔不超过 3 年的演员。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2018-05-06
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2021-03-06
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多