SQL按一列分组

SQL按一列分组,sql,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 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 我需要的是,对于每一个不同的身份证,有史以来最高的税收。如果该税发生两次,我希望记录有最高的起始日期

这是我的疑问:

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中的所有列进行分组?

据我所知,SELECT中所有未以某种方式聚合的列都必须是GROUP by语句的一部分。

据我所知,SELECT中所有未以某种方式聚合的列,必须是GROUP BY语句的一部分。

我已经测试过,这是一个有效的解决方案

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

我已经测试过了,这是一个有效的解决方案

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

你试过分析功能吗

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

你试过分析功能吗

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

Oracle Database 10g Express Edition 10.2.0.1.0版Oracle Database 10g Express Edition 10.2.0.1.0版