#sql
Вопрос:
Мой столик находится:
Я хочу подсчитать за каждый месяц общее количество обращений каждого пользователя к каждому продукту, а также общее количество обращений за каждый месяц для этого пользователя, игнорирующего продукты.
Итак, в моем результате мне нужно показать что-то вроде этого: (7 отдельных дней в месяце 07/2020 для этого пользователя, 1 отдельный день для produto Spark, 6 отдельных дней для MapReduce и 7 отдельных дней для Tez)
Итак, в течение месяца 07/2020 этот пользователь_1 имеет:
- 7 общий доступ в этом месяце
- 1 полный доступ для Spark
- всего 6 достижений для MapReduce
- 7 полный доступ для Tez
SELECT max(acessos_origem) AS access_product , max(acessos_geral) AS acessos_geral , upper(USUARIO) as USUARIO , ORIGEM , MES_ANO , EQUIPE , timestamp_format( to_char(DATA, 'MM/YYYY'), 'MM/YYYY') as DATA FROM (SELECT DENSE_RANK() OVER (PARTITION BY A.USUARIO, A.ORIGEM, A.MES_ANO ORDER BY A.DATA ASC) AS acessos_origem, DENSE_RANK() OVER (PARTITION BY A.USUARIO, A.MES_ANO ORDER BY A.DATA ASC) AS acessos_geral, USUARIO, EQUIPE, ORIGEM, MES_ANO, DATA FROM ( SELECT EQUIPE, USUARIO, ORIGEM, CONCAT(concat( extract(month FROM data), '/'), extract(year FROM data)) AS mes_ano, data FROM db2i1c68.DADOS_USUARIOS_PLATAFORMA_BBDATA a WHERE 1=1 AND usuario = 'bigbbd01' )a )b WHERE 1=1 AND MES_ANO = '7/2020' GROUP BY upper(USUARIO) , ORIGEM, MES_ANO, EQUIPE, timestamp_format( to_char(DATA, 'MM/YYYY'), 'MM/YYYY')
Используя этот выбор, я получаю следующий результат:
Проблема в том, что мне нужно группировать по продуктам, но мой access_geral должен показывать максимальный просмотр только по пользователям/месяцам, как я использую в своем разделе, даже если я группируюсь в последнем выборе.
Комментарии:
1. Помечайте только ту базу данных, которую вы используете.
Ответ №1:
Хммм … на основе ваших выборочных данных и желаемых результатов это выглядит как относительно простая агрегация:
SELECT USUARIO, TO_CHAR(data, 'YYYY/MM') as yyyymm, product,
COUNT(*) as num_product,
MAX(MAX(access_count_user)) OVER (PARTITION BY USUARIO, TO_CHAR(data, 'YYYY/MM')) as num_overall
FROM db2i1c68.DADOS_USUARIOS_PLATAFORMA_BBDATA a
GROUP BY USUARIO, TO_CHAR(data, 'YYYY/MM'), product;
Ваш запрос намного сложнее; вопрос не полностью объясняет, что он делает.
Комментарии:
1. Эй, Гордон, в своем запросе я создаю два столбца DENSE_RANK() для подсчета отдельных дней для каждого месяца, сгруппированных по пользователям и пользователям/продуктам, таким образом, у меня есть общий доступ, который пользователь_1 имеет в месяце 07/2020, и общий доступ, который пользователь_1 имеет к каждому продукту в этом месяце 07/2020. В моем первом выборе я использую MAX (), чтобы уловить общее количество отдельных дней для продуктов и месяца
2. Если я использую выбор, который вы мне отправляете, в результате у меня будет 3 разных значения в num_overall, но мне нужно показать значение » 7 » для каждых 3 строк
3. @HesloandosSantosViana . . . Я понимаю. В целом должна использоваться функция окна (я обновил ответ).
4. Спасибо, Гордон, я не понимаю, что мне нужно использовать два max() в моем внешнем выборе, еще раз спасибо за помощь 😀