MySQL Query - группировка по вопросам - PullRequest
0 голосов
/ 07 июля 2011

Следующий запрос MySQL выдает мне список session_ids и связанного с ним использования. То, что я хотел бы сделать, это сгруппировать каждую сессию в один ряд с максимальным отображением загрузки и выгрузки. Может быть несколько повторов имени пользователя, оно должно быть сгруппировано в сеансе.

Когда я пытаюсь использовать группирование по, наибольшее значение не всегда выбирается.

  SELECT USERNAME, ACCTSESSIONID,
         IFNULL(ACCTINPUTGW ,0) * POW(2,32) + IFNULL(ACCTINPUTOCT , 0) as TOTAL_UPLOAD,
         IFNULL(ACCTOUTPUTGW,0) * POW(2,32) + IFNULL(ACCTOUTPUTOCT, 0) as TOTAL_DOWNLOAD
    FROM ACCOUNTING
   WHERE DATE_FORMAT(FROM_UNIXTIME(TIME_STAMP), '%Y-%m-%d') = '2011-07-05'
ORDER BY USERNAME ASC, ACCTSESSIONID 

-

USERNAME    ACCTSESSIONID        TOTAL_UPLOAD   TOTAL_DOWNLOAD
kor1        SESSION232442        341594114     5671726599
kor1        SESSION232442        331306202     5571382940
kor1        SESSION232444        338083784     5609510490
kor1        SESSION454355        323367019     5451121083
kor2        SESSION943209        323132957     5450522047  
ran32       SESSION934082        323132957     5450522047
ran62       SESSIONA34324        9532356       5450523537

Ответы [ 2 ]

2 голосов
/ 07 июля 2011

Для этого вы должны использовать агрегатные функции MIN () / MAX ():

SELECT USERNAME, ACCTSESSIONID,
     MAX(IFNULL(ACCTINPUTGW ,0) * POW(2,32) + IFNULL(ACCTINPUTOCT , 0)) as TOTAL_UPLOAD,
     MAX(IFNULL(ACCTOUTPUTGW,0) * POW(2,32) + IFNULL(ACCTOUTPUTOCT, 0)) as TOTAL_DOWNLOAD
FROM ACCOUNTING
WHERE
    DATE_FORMAT(FROM_UNIXTIME(TIME_STAMP), '%Y-%m-%d') = '2011-07-05'
GROUP BY
    USERNAME, ACCTSESSIONID
ORDER BY
    USERNAME ASC, ACCTSESSIONID 

Подробнее о агрегатной функции в MySQL: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

1 голос
/ 07 июля 2011
  SELECT USERNAME, ACCTSESSIONID,
         MAX(IFNULL(ACCTINPUTGW ,0) * POW(2,32) + IFNULL(ACCTINPUTOCT , 0))
           AS TOTAL_UPLOAD,
         MAX(IFNULL(ACCTOUTPUTGW,0) * POW(2,32) + IFNULL(ACCTOUTPUTOCT, 0))
           AS TOTAL_DOWNLOAD
    FROM ACCOUNTING
   WHERE DATE_FORMAT(FROM_UNIXTIME(TIME_STAMP), '%Y-%m-%d') = '2011-07-05'
GROUP BY USERNAME ASC, ACCTSESSIONID 
ORDER BY USERNAME ASC, ACCTSESSIONID 

Примечание 1 : вместо IFNULL() вы также можете использовать COALESCE(). Это может быть предпочтительнее, так как может иметь более 2 аргументов и также используется во многих других СУБД.

Примечание 2 : Вместо:

DATE_FORMAT(FROM_UNIXTIME(TIME_STAMP), '%Y-%m-%d') = '2011-07-05'

Вы можете использовать:

TIME_STAMP >= '2011-07-05'  AND  TIME_STAMP < '2011-07-06'

Нет необходимости вызывать 2 функции для каждой строки в таблице.

...