Как я могу выбрать уникальные результаты из таблицы на основе столбца?

У меня есть "семейная" таблица со следующими столбцами:

  • имя
  • фамилия
  • возраст

Я хочу запросить эту таблицу таким образом, чтобы в моем списке результатов отображался только ОДИН член каждой семьи, и этот член должен быть самым старым, а также ограничить результат до 25.

Пример: представьте следующую таблицу с ~ 500 тыс. записей.

имяфамилиявозраст
Джонкузнец5
Мэрикузнец10
Джексын10
Джодочь10

Список ожидаемых результатов должен вернуть [{mary, smith, 10}, {jack, son, 10}, {joe, daught, 10}].

Мое текущее решение состоит в том, чтобы вытащить всю таблицу, а затем вручную удалить «дубликаты» в зависимости от возраста и фамилии. Хотя это «хорошо», когда мой набор данных станет больше, возможно, это будет просто потраченное впустую время обработки.

Возможно ли это с помощью SQL?

должен быть старше

iCodeLikeImDrunk 17.03.2022 21:37

на самом деле да; похоже на ответ The Impaler .. теперь, чтобы перевести это на jpa

iCodeLikeImDrunk 17.03.2022 21:47
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
2
22
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете использовать 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

похоже, это работает/делает то, что я хотел. какие-либо проблемы с производительностью, которые я должен учитывать? Кроме того, это очень круто, кстати.

iCodeLikeImDrunk 17.03.2022 21:46

Никаких серьезных проблем с производительностью, если только вы не обрабатываете миллионы строк.

The Impaler 17.03.2022 21:47

ясно спасибо! деф меньше миллиона. Кроме того, я буквально ограничиваю список результатов до 25, потому что требования

iCodeLikeImDrunk 17.03.2022 21:48
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

Другие вопросы по теме