Индекс строки приращения и объединение с другими таблицами на динамических датах - PullRequest
0 голосов
/ 07 октября 2019

Вопрос:

Я рассматривал различные другие примеры для увеличения по строкам, но все они приводили к одному и тому же неправильному выводу. Проблема, с которой я столкнулся, заключалась в том, что мой код не был успешно увеличен по строкам для построения правильного индекса для каждой новой строки в наборе результатов для эпизода (выделено красным цветом ниже).

enter image description here

Моя первая попытка была:

SET @ep_1 = "Peaky Blinders";
SET @curRow_1 = 0;

SELECT
    DATE_FORMAT(created_at, "%Y%m%d") AS year_month_day,
    @curRow_1 := @curRow_1 + 1 AS row_number,
    @ep_1 AS episode_title,
    COUNT(id) AS episode_plays
FROM netflix.episode_plays
WHERE
    episode_id = "xyz"
    AND created_at >= "2019-07-01" AND created_at <= "2019-07-07"
GROUP BY 1

Кроме строк, которые не увеличивались правильно;Я также получил следующую ошибку, когда попытался установить некоторые переменные в начале моего кода:

Error running query: Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='

(Примечание: я не связан с Netflix, я просто использовал фиктивные данные Netflix, чтобы ответить на мой вопрос)

1 Ответ

0 голосов
/ 07 октября 2019

Я разбил свой вопрос на несколько разделов и получил окончательный ответ ниже.

  • Самая важная часть заключалась в том, чтобы добавить начальные наборы результатов в подзапросы, а затем выбрать данные изтаблицы x1, x2 и т. д.
  • Вторая часть вопроса была о том, как объединить несколько наборов данных (в моем случае: как сделать это не только для одного конкретного эпизода netflix, но инесколько эпизодов)? Я остановился на предложении UNION ALL -.
  • В первой итерации я попытался жестко закодировать даты, а затем нашел функцию INTERVAL очень полезной.
  • Наконец, я исправил unicode-error, добавив COLLATE utf8_unicode_ci после установки моих переменных.

Если вы обнаружите ошибки в моем коде или у вас есть другие предложения, пожалуйста, не стесняйтесьпредложить их.

-- SET DATA

-- variables for table x1
SET @ep_1 = "Peaky Blinders" COLLATE utf8_unicode_ci;
SET @id_1 = (SELECT id FROM netflix.episodes WHERE episode_title = @ep_1);
SET @date_1 = (SELECT created_at FROM netflix.episodes WHERE episode_title = @ep_1);
SET @curRow_1 = 0;

-- variables for table x2
SET @ep_2 = "Brooklyn Nine-Nine" COLLATE utf8_unicode_ci;
SET @id_2 = (SELECT id FROM netflix.episodes WHERE episode_title = @ep_2);
SET @date_2 = (SELECT created_at FROM netflix.episodes WHERE episode_title = @ep_2);
SET @curRow_2 = 0;


-- QUERY DATA

SELECT
    x1.year_month_day,
    @curRow_1 := @curRow_1 + 1 AS row_number,
    x1.episode_title,
    x1.episode_plays
FROM (
    SELECT
        DATE_FORMAT(created_at, "%Y%m%d") AS year_month_day,
        @ep_1 AS episode_title,
        COUNT(id) AS episode_plays
    FROM netflix.episode_plays
    WHERE
        episode_id = @id_1
        AND created_at >= @date_1 AND created_at <= DATE_ADD(@date_1 , INTERVAL 7 DAY)
    GROUP BY 1) x1

UNION ALL

SELECT
    x2.year_month_day,
    @curRow_2 := @curRow_2 + 1 AS row_number,
    x2.episode_title,
    x2.episode_plays
FROM (
    SELECT
        DATE_FORMAT(created_at, "%Y%m%d") AS year_month_day,
        @ep_2 AS episode_title,
        COUNT(id) AS episode_plays
    FROM netflix.episode_plays
    WHERE
        episode_id = @id_2
        AND created_at >= @date_2 AND created_at <= DATE_ADD(@date_2 , INTERVAL 7 DAY)
    GROUP BY 1) x2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...