为第1列中的每一列选择第3列的第一次出现

时间:2016-03-07 13:22:43

标签: sql-server-2008 tsql

我的数据库是SQL Server 2008我有一个3列的表。姓名,类型,时间。

我需要为每个名称选择第一个(按时间 - 第3列)事件,并且类型为1。     例如,它可能是

(George,1,15:00)                      (乔治,3,15:00)                      (乔治,1,16:00)                      (乔治,1,16:10)                      (玛丽,1:15:00)                      (玛丽,3,15:00)                      (玛丽,1,16:00)                      (玛丽,1:16:10)

我只需要(George,1,15:00)                    (玛丽,1:15:00)

我做了这个,但它不起作用。我知道这不是明确的正确使用。

  select distinct(an1. name ), an2.Time 
  from mytable an1
  left join mytable an2
  on an1.id=an2.id
  where an1.type =1  

2 个答案:

答案 0 :(得分:1)

您可以使用交叉申请或rownumber或分组

  ; with cte
      as
       (
       select distinct name from mytable where type=1
       )
        select * from cte t1
        cross apply
        (
        select top 1 time from mytable t2 where t1.name=t2.name order by time desc) b

with cte
as
(select name,time,
row_number() over (partition by name order by time desc) as rn
from mytable where type=1
)
select * from cte where rn=1

答案 1 :(得分:1)

您可以使用ROW_NUMBER

SELECT name, [Time]
FROM (
  SELECT name, [Time], 
         ROW_NUMBER() OVER (PARTITION BY name 
                            ORDER BY [Time] DESC) AS rn
  FROM mytable 
  WHERE type = 1) AS t
WHERE t.rn <= 1