MySQL объединяет несколько столбцов в час

0

Был быстрый взгляд и не мог найти мой вопрос снова. Поэтому я надеюсь, что кто-то здесь может помочь. У меня есть большая таблица с аналогичной структурой ниже.

DateTime | InboundUserID | OutboundUserID | CustomerUserID | Cost | Mins | Account Number

Я пытаюсь сгруппировать эти данные в часовые куски и сохранить результат в другой таблице с аналогичной структурой ниже.

Date | HourFrom | HourTo | SumMins | SumCost | OutboundUserID | CustomerUserID | Account Number

Я написал следующий код/​​запрос, чтобы сделать это, но это не совсем правильно. В основном группа с помощью не всех данных суммируется. Например, при просмотре вновь созданной таблицы у меня есть все данные OutboundUserID, но ни один из данных CustomerUserID.

    for(int i=0;i <=23;i++)
    {
        for(int j=1 ; j <=31 ; j++)
        {
            String Time = String.format("%02d", i);

            query = "INSERT DELAYED INTO correlated_calls_hourly " +
                    " SELECT DateOnly,HourFrom,HourTo,DURATION,CALLCOUNT,`Price Group ID`,INBOUNDCOST,INBOUNDREVENUE,`InboundCustomerID`,OUTBOUNDCOST,OUTBOUNDREVENUE,`Outbound Customer ID`,`Customer ID`,`Account Number`,`Service` FROM" +
                    " ("+
                        " SELECT "+
                        /* snip sum(),case and date/time part of query */
                        " GROUP BY  DateOnly,`InboundCustomerID`,`OutboundCustomerID`,`CustomerID`,`AccountNumber`,`PriceGroupID`,`Service`" +
                    " )a ";
        }
    }

Я уже сделал шаг по созданию трех разных таблиц, чтобы суммировать данные отдельно с помощью OutboundUserID/InboundUserID/CustomerUserID. Но было бы намного более элегантно, если бы я мог просто правильно подготовить эту сводную таблицу.

Если бы кто-нибудь мог помочь мне подумать о том, как получить желаемый результат через один SQL-запрос, я был бы очень благодарен.

Большое спасибо заранее

Алан

  • 0
    Вы рассматривали возможность использования Views? Создание одной таблицы кажется слишком сложным, если вы просто хотите соединить данные вместе, чтобы иметь вид таблицы «отчета».
  • 0
    Я думал об этом. К сожалению, в настоящее время длина большой таблицы составляет 12 миллионов строк, и она увеличивается примерно на 500 000 строк в день. Я считаю, что это выходит за рамки простого представления?
Теги:
aggregate

2 ответа

0

После небольшого вдохновения я понял, что решение было очевидно. Соедините столбцы вместе и выполните группу в объединенной колонке.

CONCAT (InboundUserID, '', OutboundUserID, '', CustomerUserID) как uniqueKey GROUP BY uniqueKey.

0

Что-то вроде этой работы?

INSERT INTO correlated_calls_hourly (Date, HourFrom, HourTo, SumMins, SumCost, OutboundUserID, CustomerUserID, AccountNumber)
SELECT 
  CONVERT(varchar(8), GETDATE(), 112),
  hour(DateTime),
  hour(DateTime) + 1, 
  SUM(Mins),
  SUM(Cost),
  OutboundUserID,
  CustomerUserID,
  AccountNumber
GROUP BY
  CONVERT(varchar(8), GETDATE(), 112),
  hour(DateTime)
  OutboundUserID,
  CustomerUserID,
  AccountNumber

Функция преобразования преобразует дату и время в дату. Вам, вероятно, придется немного подстроить его в соответствии с вашими РСУБД, но я не вижу причин, почему это не сработает.

  • 0
    Спасибо за ваш ответ. Проблема заключалась в группировке по нескольким ключевым значениям (InboundUserID | OutboundUserID | CustomerUserID), которая работала некорректно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню