2016-05-18 1 views
2

Я пытался найти максимум каждого члена группы, используя советы из других сообщений, но, похоже, это другая проблема, поскольку счетчик основан на счетчике (*), а не на определенном столбце.Как найти max в каждой группе, когда вычисление выполняется с помощью count (*)?

В моей таблице несколько столбцов; те, которые мне нужны: дата и ветка. Каждая запись таблицы представляет собой транзакцию в этой ветке. Мне нужно знать каждую дату, которая является филиалом с большим количеством транзакций и сколько их было сделано.

Я начал с:

Select date, branch, count(*) as total 
from table 
group by date, branch 

Я попытался макс (всего), но это было бы просто дать мне строку вместо одной на каждую группу.

Я пытался присоединиться с собой, что-то вроде этого, но это не распространяется, потому что работа максима не признается в статье, имеющей:

Select date, branch, count(*) as maxim 
(Select date, branch, count(*) as total 
from table 
group by date, branch) a 
having maxim=max(total) 
group by date, branch 

Любая идея ?, спасибо!

+0

Группа должна сделать это. Осторожно на вашем примере, вы используете count (*) не max (total) для maxim, я думаю, это просто опечатка в SO – AxelH

ответ

0

Попробуйте это:

select t1.date, t2.branch, t1.max_total 
from (
    select date, max(total) as max_total 
    from (
    select date, branch, count(*) as total 
    from mytable 
    group by date, branch) as x 
    group by date  
) as t1  
join (
    select date, branch, count(*) as total 
    from mytable 
    group by date, branch 
) as t2 on t1.date = t2.date and t1.max_total = t2.total 

Идея заключается в том, чтобы использовать запрос, который вы начали с в два раза производной таблицы:

  • Первый раз, когда вы используете его для того, чтобы получить максимальное количество за date
  • Второй раз, когда вы используете его для извлечения значения branch, имеющего счет total, равный максимальному числу. В случае связей может быть несколько филиалов.

Demo here

Если DB2 поддерживает функцию окна, вы можете использовать следующую команду, которая, если это применимо, является более эффективным:

select date, branch, total 
from (
    select date, branch, count(*) as total, 
     rank() over (partition by date order by count(*) desc) as rn 
    from mytable 
    group by date, branch) as t 
where t.rn = 1 
+0

Спасибо! это сработало – NatBI

+0

@NatBI Glad Я смог помочь и приветствовать Stack Overflow. Пожалуйста, отметьте это или любой другой ответ, как принято, если это поможет вам решить вашу проблему. –

0

Пожалуйста, попробуйте следующий код.

DECLARE @table TABLE 
    ([Date] date,Branch varchar(10),trans int) 

INSERT INTO @table 
    (
     [Date], 
     Branch, 
     trans 
    ) 
    VALUES 
    ('2015-01-01','b1',1),('2015-01-01','b1',2),('2015-01-01','b1',3), 
    ('2015-01-02','b1',4),('2015-01-02','b1',5),('2015-01-02','b1',6), 
    ('2015-01-01','b2',1),('2015-01-01','b2',2),('2015-01-01','b2',3) 

Select 
    [Date], Branch, COUNT(trans) AS total 
FROM 
    @table 
GROUP By 
    [Date], Branch 
    ORDER BY [Date] 
Смежные вопросы