Что не так с этим Query, переведенным из PostgreSQL в MariaDB? - PullRequest
0 голосов
/ 07 мая 2019

Я работаю над преобразованием следующего запроса PostgreSQL к MariaDB. Мой преобразованный запрос возвращает поле «Новые пользователи» неправильно. Что я делаю не так?

Оригинал, рабочий запрос PostgreSQL:

WITH 

users AS (
  SELECT user_id,
         MIN(occurred_at) AS activated_at
    FROM modeanalytics.retention_events 
   WHERE occurred_at <= NOW()
   GROUP BY 1
),

events AS (
  SELECT user_id,
         event_name,
         occurred_at
    FROM modeanalytics.retention_events 
   WHERE occurred_at <= NOW()
)
SELECT *
  FROM (
SELECT *,
       MAX(CASE WHEN user_period = 0 THEN retained_users ELSE NULL END) OVER (PARTITION BY "Signup Date") AS "New Users",

       retained_users/
          MAX(CASE WHEN user_period = 0 THEN retained_users ELSE NULL END) OVER (PARTITION BY "Signup Date")::FLOAT AS retention_rate,

       (LAG(retained_users) OVER (PARTITION BY "Signup Date" ORDER BY "Signup Date") - retained_users)/
          MAX(CASE WHEN user_period = 0 THEN retained_users ELSE NULL END) OVER (PARTITION BY "Signup Date")::FLOAT AS churn_rate,

       (LAG(retained_users) OVER (PARTITION BY "Signup Date" ORDER BY "Signup Date") - retained_users)/
          LAG(retained_users) OVER (PARTITION BY "Signup Date" ORDER BY "Signup Date")::FLOAT AS churn_rate_from_previous_period
  FROM (

SELECT DATE_TRUNC('month',u.activated_at) AS "Signup Date",

       (EXTRACT('year' FROM e.occurred_at) - EXTRACT('year' FROM u.activated_at)) * 12 + 
       (EXTRACT('month' FROM e.occurred_at) - EXTRACT('month' FROM u.activated_at)) - 
       CASE WHEN (CEILING(DATE_PART('day',e.occurred_at) - DATE_PART('day',u.activated_at))) < 0 THEN 1 ELSE 0 END AS user_period,

       COUNT(DISTINCT e.user_id) AS retained_users
  FROM users u
  JOIN events e
    ON e.user_id = u.user_id
   AND e.occurred_at >= u.activated_at
 WHERE u.activated_at >= DATE_TRUNC('month',NOW()) - INTERVAL '25 month'
 GROUP BY 1,2
       ) x
       ) z
 WHERE user_period != 0
 ORDER BY 1,2

А вот моя последняя попытка переписать для MariaDB:

WITH 

users AS (
  SELECT id,
         MIN(onboarded_at) as onboarded_at
    FROM users
   WHERE onboarded_at <= NOW()
   GROUP BY 1
),

events AS (
  SELECT receiver_id,
         type,
         created_at
    FROM events 
   WHERE created_at <= NOW()
)
SELECT *
  FROM (
SELECT *,
       MAX(CASE WHEN user_period = 0 THEN retained_users ELSE NULL END) OVER (PARTITION BY "Signup Date") AS "New Users",

       (retained_users /
          MAX(CASE WHEN user_period = 0 THEN retained_users*1.0 END) OVER (PARTITION BY "Signup Date")) AS retention_rate,

       (LAG(retained_users) OVER (PARTITION BY "Signup Date" ORDER BY "Signup Date") - retained_users)/
          MAX(CASE WHEN user_period = 0 THEN retained_users ELSE NULL END) OVER (PARTITION BY "Signup Date") AS churn_rate,

       (LAG(retained_users) OVER (PARTITION BY "Signup Date" ORDER BY "Signup Date") - retained_users)/
          LAG(retained_users) OVER (PARTITION BY "Signup Date" ORDER BY "Signup Date") AS churn_rate_from_previous_period
  FROM (

SELECT
        DATE_FORMAT(u.onboarded_at, '%Y-%m-01') AS "Signup Date",

       (EXTRACT(YEAR FROM e.created_at) - EXTRACT(YEAR FROM u.onboarded_at)) * 12 + 
       (EXTRACT(MONTH FROM e.created_at) - EXTRACT(MONTH FROM u.onboarded_at)) - 
       CASE WHEN (CEILING(DAY(e.created_at) - DAY(u.onboarded_at))) < 0 THEN 1 ELSE 0 END AS user_period,
       COUNT(DISTINCT e.receiver_id) AS retained_users
  FROM users u
  JOIN events e
    ON e.receiver_id = u.id
   AND e.created_at >= u.onboarded_at
 WHERE u.onboarded_at >= DATE_FORMAT(CURDATE(), '%Y-%m-01 00:00:00') - INTERVAL 5 MONTH
 GROUP BY 1,2
       ) x
       ) z
 WHERE user_period != 0
 ORDER BY 1,2

Моя попытка переписать для MariaDB неправильно выводит столбец "Новые пользователи". Что я делаю не так?

1 Ответ

1 голос
/ 07 мая 2019

Для имен таблиц и столбцов (содержащих пробелы) вместо двойных кавычек необходимо использовать обратные галочки, см. этот вопрос

Обычные строки должны быть заключены в одинарные кавычки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...