需要帮助使用局部变量减去具有多个组的前一行值

Posted

技术标签:

【中文标题】需要帮助使用局部变量减去具有多个组的前一行值【英文标题】:Need help using local variables to subtract previous row value having several groups 【发布时间】:2018-09-17 12:29:01 【问题描述】:

我有3张表如下:

+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| id        | int(11)      | NO   | PRI | 0       |       |
| full_name | varchar(200) | YES  |     | NULL    |       |
| gender    | varchar(1)   | YES  |     | NULL    |       |
+-----------+--------------+------+-----+---------+-------+
+----------+---------+------+-----+---------+-------+
| Field    | Type    | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| actor_id | int(11) | YES  | MUL | NULL    |       |
| movie_id | int(11) | YES  | MUL | NULL    |       |
| salary   | int(11) | YES  |     | NULL    |       |
+----------+---------+------+-----+---------+-------+
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | NO   | PRI | 0       |       |
| title | varchar(100) | YES  |     | NULL    |       |
| year  | int(11)      | YES  |     | NULL    |       |
| genre | varchar(100) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+

我正在尝试找出哪个演员的电影间隔时间最长。

在参与者相同的情况下(或者默认为 0),我正在尝试使用局部变量来引用前一行的值。但是由于某种原因,@previousName 变量会返回一个随机的名称列表。

代码如下:

SELECT 
    a.full_name, 
    m.year,
    m.title,
    @PreviousName,
    @PreviousYear,
    if(@PreviousName = a.full_name, m.year - @PreviousYear, 0) AS Delta,
    @PreviousName := a.full_name,
    @PreviousYear := m.year 
FROM
    actors AS a
        INNER JOIN
    cast AS c ON a.id = c.actor_id
        INNER JOIN
    movies AS m ON c.movie_id = m.id,
    (SELECT @PreviousName := null, @PreviousYear := 999) as SQLVars
ORDER BY full_name;

这是我得到的: Picture of result table

注意我使用的是 mysql V5.7,所以窗口函数不是一个选项。

【问题讨论】:

如果一个演员在同一年有两部电影怎么办? 【参考方案1】:

您可以使用相关子查询来做到这一点:

select mc.*, (year - prev_year) as diff
from (select c.*, m.year,
             (select m2.year
              from movies m2 join
                   cast c2
                   on c2.movie_id = m2.id
              where c2.actor_id = c.actor_id and
                    m2.year < m.year
              order by m2.year desc
              limit 1
             ) prev_year
      from movies m join
           cast c
           on c.movie_id = m.id
     ) mc
order by diff desc;

这是假设演员不在同一年的两部电影中。如果你有一个发布日期什么的,那会更有效地安排时间。

【讨论】:

你的代码不适合我。如果是这样就好了,但我还是想知道我的方法哪里出了问题。 @ldodo 。 . . “不运行”相当模糊,并不能帮助我或其他任何人发现问题。 你说得对,我很抱歉。我得到的错误是“字段列表中的未知列'年份'” - 在第一行。另外,第7行我没看懂,SQL怎么知道“c.actor_id是什么?因为”c“不包含在FROM子句中。 @Idodo 。 . .这种疏忽很容易解决。

以上是关于需要帮助使用局部变量减去具有多个组的前一行值的主要内容,如果未能解决你的问题,请参考以下文章

JMeter 一个线程组的多个请求,怎么设置指定

如何在Python中使用定义中的局部变量返回? [关闭]

JavaSE8基础 final 修饰引用类型的局部变量 地址值不能变

局部变量和成员变量的区别

全局变量和局部变量的区别

java中静态变量的默认值是0?