Нужен запрос MySQL для получения второго значения на основе наиболее часто встречающейся строки

Следующий запрос обнаруживает большинство вхождений diallednumber :

SELECT COUNT( * ) AS  `Rows` , diallednumber
FROM logData
GROUP BY diallednumber
ORDER BY  `Rows` DESC 
LIMIT 20

У меня есть другой столбец, который показывает стоимость diallednumber .

Я не могу написать запрос, чтобы предоставить самый дорогой diallednumber в зависимости от количества раз, когда он произошел.

1
nl ja de
@MarcB: что случилось с вашими навыками чтения ума или умением читать между строк? (Вы правы, информация не указана, и мы должны угадать).
добавлено автор Jonathan Leffler, источник
и мы должны просто уметь догадываться, как вы храните данные о стоимости вызовов? <Код> сумма (cost_of_dialing) ?
добавлено автор Marc B, источник

2 ответы

Количество вызовов на номер

SELECT COUNT(*) AS calls, dialledNumber
  FROM logData
 GROUP BY dialledNumber

Наибольшее количество звонков на номер

SELECT MAX(calls) AS maxCalls
  FROM (SELECT COUNT(*) AS calls, dialledNumber
          FROM logData
         GROUP BY dialledNumber
       ) AS c

Сумма стоимости звонков на номер с наибольшим количеством звонков

SELECT SUM(l.cost), l.dialledNumber
  FROM logData AS l
  JOIN (SELECT COUNT(*) AS calls, dialledNumber
          FROM logData
         GROUP BY dialledNumber
       ) AS c
    ON l.dialledNumber = c.dialledNumber
  JOIN (SELECT MAX(calls) AS maxCalls
          FROM (SELECT COUNT(*) AS calls, dialledNumber
                  FROM logData
                 GROUP BY dialledNumber
               )
       ) AS m
    ON m.maxCalls = c.calls

Если есть два числа с одинаковым максимальным количеством вызовов, оба будут показаны. Вы можете получить максимальную сумму расходов, если хотите получить фантазию.

Подзапрос m может использоваться без объединения как «простого» номера:

SELECT SUM(l.cost), l.dialledNumber
  FROM logData AS l
  JOIN (SELECT COUNT(*) AS calls, dialledNumber
          FROM logData
         GROUP BY dialledNumber
       ) AS c
    ON l.dialledNumber = c.dialledNumber
   AND c.calls = (SELECT MAX(calls) AS maxCalls
                    FROM (SELECT COUNT(*) AS calls, dialledNumber
                            FROM logData
                           GROUP BY dialledNumber
                         )
                 ) AS m

Хороший оптимизатор будет использовать тот же план запроса для обоих.

2
добавлено
Это был быстрый ответ, спасибо. Я буду играть с этим и просто проверю, что получаю то, что мне нужно, и отправлю обратно. Приветствия.
добавлено автор mflammia, источник

И наибольшая стоимость:

SELECT diallednumber
     , COUNT(diallednumber)
     , SUM(cost) 
  FROM logdata 
 GROUP 
    BY diallednumber 
 ORDER 
    BY SUM(cost) DESC LIMIT 1;
0
добавлено
Найденные запросы идеально подходят для того, что мне нужно. Спасибо.
добавлено автор mflammia, источник
DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

MySQL
MySQL
995 участник(ов)

The group is about MySQL. For code use hastebin.com. Admin: @smlkw