У меня есть "семейная" таблица со следующими столбцами:
Я хочу запросить эту таблицу таким образом, чтобы в моем списке результатов отображался только ОДИН член каждой семьи, и этот член должен быть самым старым, а также ограничить результат до 25.
Пример: представьте следующую таблицу с ~ 500 тыс. записей.
имя | фамилия | возраст |
---|---|---|
Джон | кузнец | 5 |
Мэри | кузнец | 10 |
Джек | сын | 10 |
Джо | дочь | 10 |
Список ожидаемых результатов должен вернуть [{mary, smith, 10}, {jack, son, 10}, {joe, daught, 10}].
Мое текущее решение состоит в том, чтобы вытащить всю таблицу, а затем вручную удалить «дубликаты» в зависимости от возраста и фамилии. Хотя это «хорошо», когда мой набор данных станет больше, возможно, это будет просто потраченное впустую время обработки.
Возможно ли это с помощью SQL?
на самом деле да; похоже на ответ The Impaler .. теперь, чтобы перевести это на jpa
Вы можете использовать ROW_NUMBER()
, чтобы присвоить числовое значение по возрасту (от самого старшего к самому младшему) в каждой семье. Затем вы можете выбрать первый для каждой семьи. Например:
select *
from (
select t.*,
row_number() over(partition by last_name order by age desc) as rn
from t
) x
where rn = 1
похоже, это работает/делает то, что я хотел. какие-либо проблемы с производительностью, которые я должен учитывать? Кроме того, это очень круто, кстати.
Никаких серьезных проблем с производительностью, если только вы не обрабатываете миллионы строк.
ясно спасибо! деф меньше миллиона. Кроме того, я буквально ограничиваю список результатов до 25, потому что требования
select first_name from table_name group by last_name having max(age)
При использовании GROUP BY
вам нужно будет использовать агрегатор (MIN(), MAX(), FIRST n, LAST n и т. д.) в разделе SELECT
:
SELECT MAX(u.age), u.last_name
FROM users AS u
GROUP BY u.last_name
должен быть старше