При этом:
select student_id, subject, max(test_date) maxdate
from tablename
group by student_id, subject
вы получаете все последние даты для каждого учащегося и предмета,
, поэтому вы присоединяете его к таблице и получаете нужные результаты:
select t.*
from tablename t inner join (
select student_id, subject, max(test_date) maxdate
from tablename
group by student_id, subject
) g
on g.student_id = t.student_id and g.subject = t.subject and g.maxdate = t.test_date
Взгляните на мой ответ на подобный вопрос для C#. Код был бы весьма схож, хотя поддержка кодирования несколько отличается в Java.
В основном это не ужасно легкая вещь сделать в целом. Как MSalter указывает, UTF-8 действительно помогает определить \r
или \n
поскольку представление UTF-8 тех символов все равно как ASCII, и те байты не произойдут в многобайтовом символе.
Так в основном возьмите буфер (говорят), что 2K, и прогрессивно читают назад (пропуск к 2K, прежде чем Вы были прежде, считайте следующий 2K), проверяющий на линейное окончание. Затем пропустите к точно правильному месту в потоке, создайте InputStreamReader
на вершине и a BufferedReader
вдобавок ко всему Затем просто звоните BufferedReader.readLine()
.
Используя FileReader или FileInputStream не будет работать - необходимо будет использовать или FileChannel или RandomAccessFile для цикличного выполнения через файл назад от конца. Кодировка будет проблемой, хотя, как Jon сказал.
В C# необходимо смочь установить положение потока:
От: http://bytes.com/groups/net-c/269090-streamreader-read-last-line-text-file
using(FileStream fs = File.OpenRead("c:\\file.dat"))
{
using(StreamReader sr = new StreamReader(fs))
{
sr.BaseStream.Position = fs.Length - 4;
if(sr.ReadToEnd() == "DONE")
// match
}
}