2010-03-09 5 views
2

Это, вероятно, легкий, но для жизни меня я не могу понять.Как получить максимальную сумму за день за последние X дней?

Вот мой стол:

Date   User Amount 
---------- ----- ------ 
01/01/2010 User1 2 
01/01/2010 User2 2 
01/01/2010 User1 4 
01/01/2010 User2 1 
01/02/2010 User2 2 
01/02/2010 User1 2 
01/02/2010 User2 4 
01/02/2010 User2 1 

Так в течение последних нескольких месяцев. Мне нужно получить следующие результаты:

Date   User Amount 
---------- ----- ------ 
01/01/2010 User1 6 
01/02/2010 User2 7 

В принципе, пользователь с Max(SUM(Amount)) на каждый день.

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

Спасибо.

ответ

0

Я на самом деле в конечном итоге будет следующим:

WITH ranked AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY SUM(Amount), Date, User) as 'rank', SUM(Amount) AS Amount, User, Date FROM MyTable GROUP BY Date, User 
) 
SELECT Date, User, Amount 
FROM ranked 
WHERE rank IN (select MAX(rank) from ranked group by Date) 
ORDER BY Date DESC 
+0

и это дает вам правильный результат? – van

2
SELECT MAX(amt),`Date`,`User` FROM 
    (SELECT SUM(`Amount`),`Date`,`User` as amt .... GROUP BY `Date`,`User`) 
GROUP BY `Date` 
+0

, если я уйду «Пользователь» окончательного «GROUP BY» п, я получаю ошибка. Однако, если я его добавлю, я получаю дубликаты пользовательских записей за тот же день. – Nasir

+0

Какая ошибка у вас? Вы не должны его получать. – Amber

+0

первая строка выбирает «Пользователь» в добавлении к «Дате» и агрегату, если вы попробуете, SQL будет жаловаться, что столбец «Пользователь» не является частью предложения GROUP BY или HAVING, поэтому он не может быть в SELECT. – Nasir

1
select t.* 
from (
    select Date, Max(Amount) as MaxAmount 
    from MyTable 
    group by Date   
) tm 
inner join MyTable t on tm.Date = t.Date and tm.MaxAmount = t.Amount 

Примечание: это даст вам как записи пользователей, если есть два пользователя с одинаковым максимальным количеством в данный день.

0

Может быть менее многословным с RANK ... OVER, но после это прямолинейный решение:

WITH summary_user_date 
AS (SELECT  Date, User, SUM(Amount) AS SumAmount 
    FROM  MyTable 
    GROUP BY Date, User 
) 
, summary_date 
AS (SELECT  Date, MAX(SumAmount) AS SumAmount 
    FROM  summary_user_date 
    GROUP BY Date 
) 
SELECT  summary_user_date.* 
FROM  summary_user_date 
INNER JOIN summary_date 
     ON summary_date.Date = summary_user_date.Date 
     AND summary_date.SumAmount = summary_user_date.SumAmount 

Следует отметить, что если более одного пользователя имеет одинаковую максимальную сумму, все они будут показаны. Если это не желательно, следует использовать решение на основе RANK.

0

Использование, CTE вы могли бы сделать что-то вроде:

With DailyTotals As 
    (
    Select [Date], [User], Sum(Amount) As Total 
    From #Test 
    Group By [Date], [User] 
    ) 
Select [Date],[User],Total 
From DailyTotals As DT 
Where Total = (
       Select Max(Total) 
       From DailyTotals As DT1 
       Where DT1.[Date] = DT.[Date] 
       ) 
Order By DT.[Date] 

Не-CTE решение будет:

Select [Date],[User],Total 
From (
     Select [Date], [User], Sum(Amount) As Total 
     From #Test 
     Group By [Date], [User] 
     ) As DT 
Where DT.Total = (
        Select Max(DT1.Total) 
        From (  
          Select [Date], [User], Sum(Amount) As Total 
          From #Test 
          Group By [Date], [User] 
          ) As DT1 
        Where DT1.[Date] = DT.[Date] 
        ) 
Order By DT.[Date] 
Смежные вопросы