Я думаю, вам нужно это:
select max(s.id) id, s.user_id, s.report_id, s.earned from (
select user_id, report_id, max(earned) maxearned
from submission
group by user_id, report_id
) g inner join submission s
on s.user_id = g.user_id and s.report_id = g.report_id and s.earned = g.maxearned
group by s.user_id, s.report_id, s.earned
См. Демонстрацию
Если вы хотите запросить только для report_id = 3
:
select max(s.id) id, s.user_id, s.report_id, s.earned from (
select user_id, report_id, max(earned) maxearned
from submission
where report_id = 3
group by user_id, report_id
) g inner join submission s
on s.user_id = g.user_id and s.report_id = g.report_id and s.earned = g.maxearned
group by s.user_id, s.report_id, s.earned
order by id
См. демо
Есть несколько способов получить дамп кучи. Вот некоторые из них, которые я использовал:
-XX: + HeapDumpOnOutOfMemoryError
должен вызвать дамп, если вы нажмете OOM. Если вы под управлением Java 6 jmap должен работать в Windows. Это может быть полезно, если вы хотите сбросить кучу, но еще не достигли своего OOM. Используйте диспетчер задач Windows, чтобы найти pid-код вашего Java-приложения, и запустите в консоли следующее:
jmap -dump:format=b,file=c:\heap.bin <pid>
В дополнение к VisualVM, Eclipse Memory Analyzer (также бесплатный) может помочь вам проанализировать, что все съедает. пространство после того, как вы получите дамп.
Вы можете отслеживать использование памяти с помощью JConsole.
Также поможет jstat .