如何根据上次访问时间选择唯一行

时间:2011-09-26 08:30:10

标签: sql-server select date-sorting

我希望只使用各自的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

那么select查询中缺少什么部分?

2 个答案:

答案 0 :(得分:2)

您可以使用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 :(得分:1)

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
相关问题