2013-11-01 35 views
0

我有一個交易記錄,賬目,利潤/損失和日期的數據庫。我需要找到賬戶中發生最大利潤的日期。我已經找到了一種方法來查找這些實際的最大/最小值,但我似乎無法從中得出實際的日期。我的代碼到目前爲止是這樣的:找到一個最大的日期

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

理想情況下,我想看到帳戶號碼,最小或最大,然後發生這種情況的日期。

+0

你說你需要通過賬戶找到最大利潤的日期,而不是你在哪裏使用日期> '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子句添加到語句

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 
相關問題