MariaDB, какой правильный синтаксис использовать рядом с GROUP BY 1,2? - PullRequest
0 голосов
/ 07 мая 2019

Я работаю над написанием запроса MariaDB и сталкиваюсь со следующей ошибкой:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'GROUP BY 1,2
       ) x
       ) z
 WHERE user_period != 0
 ORDER BY 1,2
-- {"us' at line 42

Вот запрос:

WITH 

users AS (
  SELECT id,
         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 ELSE NULL 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 (MONTH,u.onboarded_at) 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(DATE_PART('day',f.created_at) - DATE_PART('day',u.onboarded_at))) < 0 THEN 1 ELSE 0 END AS user_period,
       COUNT(DISTINCT f.receiver_id) AS retained_users
  FROM users u
  JOIN events f
    ON e.receiver_id = u.id
 WHERE u.onboarded_at >= DATE_TRUNC(MONTH,NOW()) - INTERVAL '25 MONTH'
 GROUP BY 1,2
       ) x
       ) z
 WHERE user_period != 0
 ORDER BY 1,2

Ошибка SQL не помогает; что я тут не так делаю?

1 Ответ

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

Ваша проблема на самом деле с этой частью запроса:

INTERVAL '25 MONTH'

правильная форма для этого

INTERVAL 25 MONTH

Другая проблема заключается в том, что MariaDB не имеет DATE_TRUNC function, поэтому предполагается, что это определенная пользователем функция с параметрами MONTH и NOW().Поскольку MONTH не заключено в кавычки, предполагается, что это имя столбца, поэтому вы получите неизвестную ошибку столбца.Чтобы решить эту проблему, вы можете заменить

DATE_TRUNC(MONTH,NOW())

на

DATE_FORMAT(CURDATE(), '%Y-%m-01 00:00:00')

Кроме того, поскольку MariaDB не имеет функции DATE_PART, вам необходимо заменить

DATE_PART('day', expression)

с

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