2013-11-01 4 views
0

У меня есть база данных транзакций, счетов, прибыли/убытка и даты. Мне нужно найти даты, когда наибольшая прибыль приходится на счет. Я уже нашел способ найти эти фактические значения max/min, но я, похоже, не могу вытащить из него фактическую дату. Мой код до сих пор, как это:Поиск даты с наибольшей суммой

Select accountnum, min(ammount) 
from table 
where date > '02-Jan-13' 
group by accountnum 
order by accountnum 

В идеале я хотел бы видеть счета NUM, на мин или макс, а затем дату которой это произошло на.

+0

u сказал, что вам нужно найти даты, в которых наибольшая прибыль происходит по счету, чем в том случае, когда вы используете дату> '02 -Jan-13 '? –

+0

Чтобы перефразировать, вам нужна одна строка на одну учетную запись, показывающую дату самой низкой прибыли и дату наивысшего (со значениями для каждого)? – bendataclear

ответ

0

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

WITH max_amount as (
    SELECT accountnum, max(amount) amount, date 
    FROM TABLE 
    GROUP BY accountnum, date 
), 
min_amount as (
    SELECT accountnum, min(amount) amount, date 
    FROM TABLE 
    GROUP BY accountnum, date 
) 
SELECT t.accountnum, ma.amount, ma.date, mi.amount, ma.date 
FROM table t 
JOIN max_amount ma 
ON ma.accountnum = t.accountnum 
JOIN min_amount mi 
ON mi.accountnum = t.accountnum 

Если вы хотите, чтобы данные для всего этого года можно добавить где положение в конце заявления

WHERE t.date > '02-Jan-13' 
0

Самый простой способ сделать это с помощью окна/аналитических функций. Это стандарт ANSI, и большинство баз данных поддерживают их (MySQL и Access являются двумя заметными исключениями).

Вот один из способов:

select t.accountnum, min_amount, max_amount, 
     min(case when amount = min_amount then date end) as min_amount_date, 
     min(case when amount = min_amount then date end) as max_amount_date, 
from (Select t.*, 
      min(amount) over (partition by accountnum) as min_amount, 
      max(amount) over (partition by accountnum) as max_amount 
     from table t 
     where date > '02-Jan-13' 
    ) t 
group by accountnum, min_amount, max_amount; 
order by accountnum 

Подзапрос вычисляет минимальное и максимальное количество для каждой учетной записи, используя min() в качестве оконной функции. Внешний запрос выбирает эти значения. Затем он использует условную агрегацию для получения первой даты, когда произошло каждое из этих значений.

0
;with cte as 
(
    select accountnum, ammount, date, 
    row_number() over (partition by accountnum order by ammount desc) rn, 
    max(ammount) over (partition by accountnum) maxamount, 
    min(ammount) over (partition by accountnum) minamount 
    from table 
    where date > '20130102' 
) 
select accountnum, 
     ammount as amount, 
     date as date_of_max_amount, 
     minamount, 
     maxamount 
from cte where rn = 1 
Смежные вопросы