Как выбрать уникальную строку по времени последнего доступа - PullRequest
2 голосов
/ 26 сентября 2011

Я хочу получить только отдельные строки с соответствующими AnsId,

как Qid: 01 имеет последний AnsId: 01

У меня следующая структура данных,

Qid  Time                  AnsId
01   2011-09-26 12:55:10   01
02   2011-09-26 12:58:32   03
03   2011-09-26 12:59:05   02
01   2011-09-26 01:02:10   01
03   2011-09-26 01:30:10   01
02   2011-09-26 01:59:10   02

Я написал следующий запрос, но он возвращает все строки:

SELECT DISTINCT Qid, Time, AnsId
FROM table
ORDER BY Time DESC

Тогда что пропущено в запросе на выбор?

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011

Вы можете использовать row_number(), чтобы найти последний ответ для Qid:

select  *
from    (
        select  row_number() over (partition by Qid order by Time desc) as rn
        ,       *
        from    YourTable
        ) as SubQueryAlias
where   rn = 1

Подзапрос необходим, поскольку SQL Server не допускает row_number непосредственно в where.

1 голос
/ 26 сентября 2011
declare @T table
(
  Qid char(2),
  [Time] datetime,
  AnsId char(2)
)

insert into @T values  
('01',   '2011-09-26 12:55:10',   '01'),
('02',   '2011-09-26 12:58:32',   '03'),
('03',   '2011-09-26 12:59:05',   '02'),
('01',   '2011-09-26 01:02:10',   '01'),
('03',   '2011-09-26 01:30:10',   '01'),
('02',   '2011-09-26 01:59:10',   '02')

select T.Qid,
       T.[Time],
       T.AnsId
from 
    (
      select T.Qid,
             T.[Time],
             T.AnsId,
             row_number() over(partition by T.Qid order by T.[Time] desc) as rn
      from @T as T
    ) as T
where T.rn = 1
order by T.[Time] desc

Результат:

Qid  Time                    AnsId
---- ----------------------- -----
03   2011-09-26 12:59:05.000 02
02   2011-09-26 12:58:32.000 03
01   2011-09-26 12:55:10.000 01
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...