2012-02-21 4 views
0

поэтому у меня есть эта таблица:SQL Group на один столбец

 
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.

Это запрос, у меня есть:

 
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

+0

Oracle Database 10g Express Edition Release 10.2.0.1.0 – Oliveira

ответ

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

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 
Смежные вопросы