2012-02-21 60 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