2012-02-21 57 views
0

,所以我有這個表:SQL組由一列

 
ID INITIAL_DATE TAX 
A 18-02-2012  105 
A 19-02-2012  95 
A 20-02-2012  105 
A 21-02-2012  100 
B 18-02-2012  135 
B 19-02-2012  150 
B 20-02-2012  130 
B 21-02-2012  140 

和我需要的是,爲每個不同的ID,有史以來最高的稅。如果該TAX出現兩次,我想要INITIAL_DATE最高的記錄。

這是查詢我:

 
SELECT ID, MAX (initial_date) initial_date, tax 
    FROM t t0 
    WHERE t0.tax = (SELECT MAX (t1.tax) 
         FROM t t1 
         WHERE t1.ID = t0.ID 
        GROUP BY ID) 
GROUP BY ID, tax 
ORDER BY id, initial_date, tax 

,但我願意相信有分組這些記錄的更好的方法。

有什麼辦法可以不按SELECT中的所有列進行分組?

+2

您正在使用什麼RBDMS? – Lamak 2012-02-21 12:55:57

+0

Oracle數據庫10g速成版版本10.2.0.1.0 – Oliveira 2012-02-21 13:46:16

回答

2

您是否嘗試過與分析功能?:解決

SELECT t0.ID, t0.INITIAL_DATE, t0.TAX 
FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY ID ORDER BY TAX DESC , INITIAL_DATE DESC) Corr 
     FROM t) t0 
WHERE t0.Corr = 1 
+0

謝謝,這非常好。 – Oliveira 2012-02-21 14:21:02

1

據我所知,SELECT中所有未以某種方式聚合的列必須是GROUP BY語句的一部分。

1

我已經測試,這是工作

SELECT t1.ID , 
    MAX(t1.data) , 
    t1.tax FROM test t1 
    INNER JOIN (SELECT ID , 
         MAX(tax) as maxtax 
       FROM test 
       GROUP BY ID 
       ) t2 ON t1.ID = t2.ID 
         AND t1.tax = t2.maxtax GROUP BY t1.ID ,t1.tax