Как я могу извлечь количество случаев, когда значение встречается как MAX? - PullRequest
2 голосов
/ 18 июня 2019

У меня есть сводная таблица, как показано ниже.

user_id     service     no_of_trx
1           A           56
1           C           43
1           B           22
2           C           10
2           A           3
3           B           45
3           C           7
4           A           77
4           B           63

Она суммирует все различные типы сервисов, использованных user_id, отсортированные по количеству транзакций, которые они совершают на сервис.Как мне извлечь Сколько раз каждый сервис отображается как лучший сервис?Ожидаемые результаты

service     occurrence_as_max
A           2
B           1
C           1

Поскольку служба A является верхней службой для пользователей 1 и 4, а службы B и C являются лучшими службами для пользователей 3 и 2. соответственно.

Что я имею до сих пор:

WITH a as

(SELECT user_id, service, count(service) no_of_trx
FROM transactions
GROUP BY user_id, service
ORDER BY no_of_trx desc),

b as
(SELECT distinct(user_id) user, max(no_of_trx) occurrence_as_max
FROM a
GROUP BY user_id
ORDER by user)


SELECT distinct(service), b.occurrence_as_max
FROM b
LEFT JOIN a ON a.user_id=b.user.
ORDER by b.occurrence_as_max desc;

Но это явно не сработает.

Ответы [ 3 ]

2 голосов
/ 18 июня 2019

Этот следующий скрипт должен работать.Это стандартный синтаксис запроса.Вам может потребоваться некоторая корректировка в BigQuery, но логика должна быть в порядке.

SELECT A.service, COUNT(*)
FROM your_table A
INNER JOIN 
(
    SELECT user_id, MAX(no_of_trx) no_of_trx
    FROM your_table
    GROUP BY user_id
)B ON A.user_id = B.user_id 
AND A.no_of_trx = B.no_of_trx
GROUP BY A.service
0 голосов
/ 18 июня 2019

Я бы просто использовал обычные оконные функции для этого:

select service, countif(seqnum = 1)
from (select t.*,
             row_number() over (partition by user_id order by no_of_trx desc) as seqnum
      from t
     ) t
group by service;

Если вы хотите, чтобы подсчитывались связи, тогда используйте rank() вместо row_number().

0 голосов
/ 18 июня 2019

Ниже для стандартного SQL BigQuery (нет необходимости в самостоятельных соединениях)

#standardSQL
SELECT service, COUNT(1) AS occurrence_as_max
FROM (
  SELECT STRING_AGG(service ORDER BY no_of_trx DESC LIMIT 1) service
  FROM `project.dataset.table`
  GROUP BY user_id
)
GROUP BY service

Вы можете проверить, поиграть с выше, используя пример данных из вашего вопроса, как в примере ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 user_id, 'A' service, 56 no_of_trx UNION ALL
  SELECT 1, 'C', 43 UNION ALL
  SELECT 1, 'B', 22 UNION ALL
  SELECT 2, 'C', 10 UNION ALL
  SELECT 2, 'A', 3 UNION ALL
  SELECT 3, 'B', 45 UNION ALL
  SELECT 3, 'C', 7 UNION ALL
  SELECT 4, 'A', 77 UNION ALL
  SELECT 4, 'B', 63 
)
SELECT service, COUNT(1) AS occurrence_as_max
FROM (
  SELECT STRING_AGG(service ORDER BY no_of_trx DESC LIMIT 1) service
  FROM `project.dataset.table`
  GROUP BY user_id
)
GROUP BY service
-- ORDER BY service 

с результатом

Row service occurrence_as_max    
1   A       2    
2   B       1    
3   C       1    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...