Найти разницу со средним числом повторяющихся строк - PullRequest
0 голосов
/ 02 апреля 2019

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 Ответ

1 голос
/ 02 апреля 2019

В 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. Внешний запрос отфильтровывает пользователей, которые видели только одно движение, и сравнивает показатель со средним для пользователя.

В это демо на БД Fiddle с вашими примерами данных, это возвращает:

| subject_id | movie_id | variation |
| ---------- | -------- | --------- |
| 1          | 1        | -5        |
| 1          | 5        | 0         |
| 1          | 8        | 5         |
| 4          | 8        | 2         |
| 4          | 5        | -2        |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...