SQL Server - возвращает несколько разных значений - PullRequest
1 голос
/ 29 февраля 2012

Я создаю тест и храню ответы игроков в базе данных SQL Server.

Таблица: tblResponses

Столбцы:

    rId (indexed primary key)
    rQuestion (links to tblQuestions)
    rResponse (the player's response, links to tblAnswers)
    rTimeLeft (timestamp of when answer was added)
    rPlayerId (uniqueidentifier, linked to tblPlayers)

Нормальная работа - это хорошо (чтение / запись), но я создаю систему отчетности, и у меня появился инструмент благодаря одной функции:

Игроки могут вернуться к вопросу и изменить свой ответ, чтосоздает новую строку в таблице «ответов».

Мне нужно выбрать только самый последний ответ в отчетах (в данном случае на основе определенного идентификатора вопроса), поэтому, если один игрок изменил свой ответ вВ какой-то момент я хочу вернуть только одну запись, а не две.

Ответ, вероятно, ослепительно очевиден, но я смотрю на него так долго, что очевидное не в моих силах.

Можеткто-нибудь поможет?

Ответы [ 2 ]

4 голосов
/ 29 февраля 2012

Есть много способов сделать это.Это пример использования аналитических функций:

SELECT *
FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY rQuestion, rPlayerId ORDER BY rId DESC) Corr
      FROM tblResponses) A
WHERE Corr = 1

Отказ от ответственности: Этот ответ работает, если у вас есть инкрементный идентификатор в таблице tblResponses.

0 голосов
/ 29 февраля 2012

Попробуйте это:

SELECT rId, rQuestion, rResponse, rTimeLeft, rPlayerId
FROM (SELECT rId, rQuestion, rResponse, rTimeLeft, rPlayerId,
    ROW_NUMBER() OVER (PARTITION BY rPlayerId, rQuestion ORDER BY rId DESC) as RowNum
    FROM tblResponses
    ) AS T
WHERE T.RowNum = 1

Здесь я предполагаю, что rID увеличивается последовательно, более высокий rID означает более недавний ответ на вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...