2017-01-28 3 views
1

Немного сложно определить, к чему я пытаюсь добраться, но вот удар здесь. Я работаю на красных смещениях и написание запроса на вершине следующего образца Таблица A:Сингулярное состояние на столбце агрегата

User ID || Active_in_Month || Max_Months_On_Platform 
1   1     6 
1   2     6 
1   5     6 
2   1     3 
2   3     3 

После группировки по «Active_in_Month», я хочу, чтобы на следующем выходе в таблице B:

Active_in_Month || Active_Distinct_Users || User_Cohorts 
1      2       2 
2      1       2 
3      1       2 
5      1       1 

«Active_Distinct_Users» - это простой COUNT (*). Однако расчет «User_Cohorts» - это место, где я застрял. Столбец должен представлять, сколько пользователей было на платформе, которые были активны не более, чем значение в комманде «active_in_month». Например, в строке 1 таблицы В таблице B было два пользователя, у которых есть «Max_Months_on_Platform»> 1 (активен в месяце). В строке 5 из В таблице B есть только 1 «User_Cohort», потому что только у 1 пользователя есть «Max Months on Platform»> 5 (Active_in_Month).

Надеюсь, это объясняет, к чему я пытаюсь добраться.

ответ

1

Решение

решаемые его, используя следующим образом, не уверен, если его наилучшим образом, но это было сделано задание:

SELECT 
    Active_in_Month, 
    COUNT(DISTINCT user_id), 
    (SELECT 
SUM(number_of_customers) 
      FROM (SELECT 
        tbl_a2.Max_Months_On_Platform AS total, 
        COUNT(DISTINCT tbl_a2.user_id) AS number_of_customers 
       FROM 
        tbl_a AS tbl_a2 
       GROUP BY tbl_a2.Max_Months_On_Platform 
       ) 
      WHERE total + 1 >= tbl_a.Active_in_Month 
     ) AS total_customers 

     FROM 
     tbl_a 
0

Надеюсь, я понял правильное правило, чтобы вычислить значение User_Cohorts. попробуйте это пожалуйста:

SELECT 
    a.Active_in_Month 
    , COUNT(*) AS Active_Distinct_Users 
    , (SELECT COUNT(DISTINCT user_id) +1 
     FROM tablea a2 
     WHERE a.Active_in_Month < a2.Max_Months_On_Platform 
     AND a.user_id <> a2.user_id 
    ) AS User_Cohorts 
FROM tablea a 
GROUP BY a.Active_in_Month 
ORDER BY a.Active_in_Month; 

образец

MariaDB [test]> SELECT 
    ->  a.Active_in_Month 
    ->  , COUNT(*) AS Active_Distinct_Users 
    ->  , (SELECT COUNT(DISTINCT user_id) +1 
    ->   FROM tablea a2 
    ->   WHERE a.Active_in_Month < a2.Max_Months_On_Platform 
    ->   AND a.user_id <> a2.user_id 
    -> ) AS User_Cohorts 
    -> FROM tablea a 
    -> GROUP BY a.Active_in_Month 
    -> ORDER BY a.Active_in_Month; 
+-----------------+-----------------------+--------------+ 
| Active_in_Month | Active_Distinct_Users | User_Cohorts | 
+-----------------+-----------------------+--------------+ 
|    1 |      2 |   2 | 
|    2 |      1 |   2 | 
|    3 |      1 |   2 | 
|    5 |      1 |   1 | 
+-----------------+-----------------------+--------------+ 
4 rows in set (0.00 sec) 

MariaDB [test]> 
+0

Спасибо, Бернд, но я получаю ошибка, указывающая, что мне нужно также группировать a.user_id. –

+0

вы можете попробовать ** SET sql_mode = ''; ** до –

+0

Возможно, это связано с тем, что я был на красном смещении, а не на sql. Я, наконец, смог его решить, хотя я не думаю, что это самое красноречивое решение. Собираемся добавить решение к сообщению. Спасибо за вашу помощь! –

Смежные вопросы