November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags
Wednesday, September 15th, 2010 06:20 pm

Для 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)

Оригинал этой записи. Комментировать можно тут или там.

Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме

Wednesday, September 15th, 2010 06:35 pm (UTC)
select a.userid, (SELECT first 1 b.nickname FROM foo b WHERE b.user_id = a.user_id order by b.date desc)
from
(SELECT distinct userid FROM foo) a
Wednesday, September 15th, 2010 08:25 pm (UTC)
Тоже вариант, но по-моему, тут многовато select'ов. Нельзя его как-нибудь сократить?
Wednesday, September 15th, 2010 08:47 pm (UTC)
зачем?
Для абстрактной красоты и пуризма рулит твой вариант.
Для практики, я управлюсь в проход/заход в foo, оракле с помощью olap синтаксиса создается окно partition by nickname, в окне записи упорядочиваются order by date desc, нумируются, берется только первая.
Wednesday, September 15th, 2010 08:57 pm (UTC)
в один проход
Wednesday, September 15th, 2010 09:44 pm (UTC)
Есть мысля - попробовать вместо второго селекта сделать group by как-нибудь