Как я могу выбрать с помощью функции max() с двумя разными группами по

#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() в моем внешнем выборе, еще раз спасибо за помощь 😀