Для DBA её тоже можно применять. На самом начальном этапе, потому что если кандидат не смог навскидку ответить, то он никакой не DBA, а чмо какое-то. А вот программист такого может сразу не знать, но придумать должен, если умный.
Итак. Есть табличка foo, в которой содержатся данные об игроках по дням в следующем виде: date, user_id, nickname и кучка других данных за указанный день, которые нас не интересуют. Игрок идентифицируется по user_id и участвует в игре под псевдонимом nickname. В теории nickname у игрока меняться не должен, а на практике может, поэтому в разные дни у одного user_id может быть разный nickname. Для каждого user_id за каждую дату может быть не более одной записи, потому что nickname в течение дня меняться не может, к счастью.
Задача: выбрать одним запросом (можно с подзапросами) полный список всех user_id и для каждого из них один-единственный nickname – тот, под которым игрок играл последний раз.
Классический ответ под катом, но если кто знает другие варианты – welcome.
SELECT a.userid, a.nickname
FROM foo a
WHERE a.date = (SELECT MAX(b.date) FROM foo b WHERE b.user_id = a.user_id)
Оригинал этой записи. Комментировать можно тут или там.
no subject
select t1.user_id, t1.nickname from t as t1 left join t t2 on t1.user_id=t2.user_id and t1.date<t2.date where t2.user_id is null
no subject
no subject
no subject
no subject
no subject
почему?
no subject
from
(SELECT distinct userid FROM foo) a
no subject
no subject
Для абстрактной красоты и пуризма рулит твой вариант.
Для практики, я управлюсь в проход/заход в foo, оракле с помощью olap синтаксиса создается окно partition by nickname, в окне записи упорядочиваются order by date desc, нумируются, берется только первая.
no subject
no subject
не люблю подзапросы...
FROM
(
SELECT userid, MAX(date)
FROM foo
GROUP BY userid
) a
INNER JOIN foo b
ON a.userid = b.userid AND a.date = b.date
Re: не люблю подзапросы...
В целом работает, только к MAX(date) надо подписать AS date, иначе ругается на отсутсвие a.date
Re: не люблю подзапросы...
no subject
select userid, LAST(nickname) from foo group by userid order by date
no subject
select userid,last(nickname) from (select userid, nickname from foo order by date) group by userid
а это уже с подзапросом
no subject
no subject