找出与重复行的平均值之差

时间:2019-04-01 21:40:33

标签: mysql sql

table with all the data

我有一个如上图所示的表格,我想查找每个主题和每个电影的查询,如果他们看过所有电影,并且输出了类似的内容,则与他们所看过的所有电影的平均median_heart_rate有所不同这个。 谢谢。

output like this

样本数据:

CREATE TABLE measures (
    subject_id int,
    movie_id int,
    median_heart_rate decimal,
    movie_score decimal
);

insert into measures values
    (1, 1, 120, 3.5),
    (1, 5, 125, 4),
    (1, 8, 130, 5),
    (2, 1, 75, 4),
    (3, 5, 92, 3.5),
    (4, 8, 72, 2.5),
    (4, 5, 68, 2);

预期结果:

| subject_id | movie_id | variation |
| ---------- | -------- | --------- |
| 1          | 1        | -5        |
| 1          | 5        | 0         |
| 1          | 8        | 5         |
| 4          | 8        | 2         |
| 4          | 5        | -2        |

1 个答案:

答案 0 :(得分:1)

在MySQL 8.0中,可以使用窗口函数解决此问题:

SELECT 
    subject_id,
    movie_id,
    median_heart_rate - avg_median_heart_rate variation
FROM (
    SELECT 
        t.*,
        COUNT(*) OVER(PARTITION BY subject_id) cnt,
        AVG(median_heart_rate) OVER(PARTITION BY subject_id) avg_median_heart_rate
    FROM measures t
) x WHERE cnt > 1;

对于每条记录,内部查询都会统计用户观看了多少电影以及相应的平均`median_heart_rate。外部查询会过滤掉只看过一个动词的用户,并将其与用户平均值进行比较。

this demo on DB Fiddle 中包含示例数据,返回:

| subject_id | movie_id | variation |
| ---------- | -------- | --------- |
| 1          | 1        | -5        |
| 1          | 5        | 0         |
| 1          | 8        | 5         |
| 4          | 8        | 2         |
| 4          | 5        | -2        |