Вывести самый сильный пароль для каждого пользователя

Пронумеруйте пароли каждого пользователя по убыванию 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 или логах.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее