Пронумеруйте пароли каждого пользователя по убыванию strength_score и оставьте первую запись. При равной оценке задайте стабильный tie-breaker, например id.
Вывести самый сильный пароль для каждого пользователя
Пронумеруйте пароли каждого пользователя по убыванию strength_score и оставьте первую запись. При равной оценке задайте стабильный tie-breaker, например id.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В базе данных присутствуют таблицы users (id, name) и passwords (id, user_id, password_hash, strength_score). Требуется составить SQL‑запрос, который для каждого пользователя выбирает пароль с наибольшим значением strength_score и выводит user_id, password_hash и strength_score, упорядочив результат по убыванию strength_score.
Ответ
Пронумеруйте пароли каждого пользователя по убыванию strength_score и оставьте первую запись. При равной оценке задайте стабильный tie-breaker, например id.
Для PostgreSQL:
WITH ranked AS (
SELECT p.*, ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY strength_score DESC NULLS LAST, id DESC
) AS rn
FROM passwords p
)
SELECT u.id AS user_id, r.password_hash, r.strength_score
FROM users u
LEFT JOIN ranked r ON r.user_id = u.id AND r.rn = 1
ORDER BY r.strength_score DESC NULLS LAST, u.id;
LEFT JOIN сохраняет пользователей без пароля с NULL-полями. Если они не нужны, используйте INNER JOIN. Это учебная выборка: хеши паролей нельзя публиковать в обычном пользовательском API или логах.