Я думаю, вы найдете это менее эффективным и, возможно, более трудным для выполнения в SQL, который не предоставляет никаких инструментов для изучения соседних строк: вам нужно выполнить подзапрос или объединение для каждой строки, чтобы посмотрите, есть ли какая-нибудь другая строка с той же фамилией.
Пока вы обрабатываете только страницу результатов за раз (что вы сказали) и сортируете по фамилии, вы можете справиться с этим, сохранив одну строку и «заглядывая вперед» на следующую строку для дубликат фамилии. Это не должно требовать много памяти в клиенте. Однако вам, вероятно, следует запросить еще один результат, чем вы хотите отобразить, чтобы быть уверенным, что первый результат на следующей странице не будет иметь такую же фамилию, как последний на этой странице.