Сводка суммы группы по - PullRequest
       14

Сводка суммы группы по

0 голосов
/ 03 октября 2019

У меня есть sql, как показано ниже:

select 
count(*), sum(summary.imp), sum(summary.taps) 
from(
   select 
   sum(impressions) as imp, sum(taps) as taps 
   from report 
   where org_id = 1 and report_date between '2019-01-01' and '2019-10-10'
   group by org_id, country, text)
summary;

Этот запрос создает производную временную таблицу в MYSQL. Есть ли способ решить это альтернативным путем?

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Я читал (но не проверял), что MySQL поддерживает несколько столбцов в различном количестве:

select 
  count(distinct org_id, country, text), sum(impressions) as imp, sum(taps) as taps 
from report 
where org_id = 1 and report_date between '2019-01-01' and '2019-10-10'

Мне было бы интересно узнать, правда ли это. Я также достаточно уверен, что что-то вроде этого будет работать:

select 
  count(distinct concat_ws('###', org_id, country, text)), sum(impressions) as imp, sum(taps) as taps 
from report 
where org_id = 1 and report_date between '2019-01-01' and '2019-10-10'
1 голос
/ 03 октября 2019

Вы можете использовать COUNT(DISTINCT ..) для пользовательской строки, состоящей из org_id, country и text. Это обеспечит подсчет только их уникальных комбинаций (таким образом, эмулируя GROUP BY и затем COUNT).

Я использовал произвольный разделитель &&. Если ваш столбец text или country может содержать этот разделитель, тогда вы можете использовать в качестве разделителя другую необычную комбинацию символов:

select 
  COUNT(DISTINCT CONCAT(org_id, '&&', country, '&&', text)), 
  sum(impressions) as imp, 
  sum(taps) as taps
from report 
where org_id = 1 and report_date between '2019-01-01' and '2019-10-10'

Для хорошей производительности определите следующий составной индекс для таблицы report: (org_id, report_date)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...