2016-07-05 7 views
0

Я использую базу данных SQL Server CE. У меня есть таблица студентов плата, как:Как сгруппировать строки и выбрать топ 1

Таблица сборы:

Erno | Date  | Due 
--------------------------- 
1  1-Jan-2016 220 
1  1-Mar-2016 200 
1  1-Apr-2016 210 
1  1-May-2016 200 
2  1-Jan-2016 250 
2  1-Feb-2016 300 
2  1-Mar-2016 220 
2  1-Apr-2016 200 
3  1-Jan-2016 300 
3  1-Feb-2016 150 
3  1-May-2016 400 
3  1-Jun-2016 300 

где Эрно является Зачисление нет. и Дата - дата депозита и Due - остаток или суммарно до этой даты.

Я хочу получить самую последнюю запись каждого Erno или Student.

Как:

Последние Благодаря информации:

Erno  Date  Due 
    1  1-May-2016 200 
    2  1-Apr-2016 200 
    3  1-Jun-2016 300 

Есть ли SQL запрос Server CE сделать это?

ответ

0

Попробуйте

select fee.erno,fee.date,fee.due from dues fee 
    join 
    (select erno, max([date]) maxdate 
     from dues group by erno) mx 
    on fee.erno = mx.erno and fee.date = mx.maxdate 
    order by fee.erno 
1

Одним из вариантов является join за столом обратно к себе, как я не верю, что row_number поддерживается:

select sf.erno, sf.date, sf.due 
from studentfee sf join (
    select erno, max(date) maxdate 
    from studentfee 
    group by erno) t on sf.erno = t.erno and sf.date = t.maxdate 
+0

Влияет ли это на производительность? На самом деле в этой таблице содержится более 80 000 строк и около 20 полей, таких как налог, плата, предыдущийBal и т. Д. – Admin

+0

@ProgramAdmin. В общем, в отношении производительности это зависит. Вы бы выиграли от индекса на 'erno' и' date'. – sgeddes

0

Вы можете попробовать это:

select sf.* 
from studentfee sf 
where sf.date = (select max(sf2.date) from studentfee sf2 where sf2.errno = sf.errno); 

А потом для работы, вы хотите индекс на studentfee(errno, date).

+0

Произошла ошибка при анализе запроса. [Номер линии токена = 3, смещение линии токена = 18, токен в ошибке = выбор] – Admin