Как получить наибольшую сумму за день за последние X дней? - PullRequest
2 голосов
/ 10 марта 2010

Это, вероятно, легко, но, судя по всему, я не могу понять это.

Вот мой стол:

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)) на каждый день.

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

Спасибо.

Ответы [ 5 ]

2 голосов
/ 10 марта 2010
SELECT MAX(amt),`Date`,`User` FROM
    (SELECT SUM(`Amount`),`Date`,`User` as amt .... GROUP BY `Date`,`User`)
GROUP BY `Date`
1 голос
/ 10 марта 2010
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 голосов
/ 10 марта 2010

Используя 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]
0 голосов
/ 10 марта 2010

Может быть менее многословным с 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 голосов
/ 10 марта 2010

Я на самом деле закончил со следующим:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...