返回按类型唯一的行列表并返回第一个传递

时间:2014-04-04 15:20:51

标签: sql sql-server

ID UserID TYPE    PASS   DATE

1  12 TRACK1  1         20140101
2  32 TRACK2  0     20140105
3  43 PULL1   1     20140105
4  66 PULL2   1     20140110
5  54 PULL1   0     20140119
6  54 TRACK1  0     20140120

因此,用户可以多次尝试“类型”,因此他们可以多次“TRACK1”,或多次“PULL2”。

我想为每个用户返回每个唯一“类型”的第一个PASS(1)。

我想返回pass和fail行,但只返回pass或fail的第一个实例。

我该怎么做?

样本表和输出

ID UserID TYPE    PASS   DATE

1  12 TRACK1  1     20140101
2  12 TRACK2  0     20140105
3  12 PULL1   1     20140105
4  12 PULL2   1     20140110
5  12 PULL1   0     20140119
6  12 TRACK1  0     20140120
7  12 TRACK1  0     20140121
8  12 PULL1   1     20140115
9  12 TRACK2  0     20140125

output:
1  12 TRACK1  1     20140101
2  12 TRACK2  0     20140105
3  12 PULL1   1     20140105
4  12 PULL2   1     20140110

2 个答案:

答案 0 :(得分:4)

select t1.*
from UserTrackStatus t1
join
(
  select userid, 
         type, 
         min(date) as min_date
    from UserTrackStatus
    group by userid, type
) t2 on t1.userid = t2.userid and t1.type = t2.type and t1.date = t2.min_date

SQLFiddle

答案 1 :(得分:1)

只需使用CTE和ROW_NUMBER来识别哪个记录首先

;
WITH    cte
          AS (
               SELECT *
                   ,ROW_NUMBER() OVER ( PARTITION BY [UserID], [Type] ORDER BY [date] ASC ) AS rn
                FROM MyTable
                WHERE PASS = 1
             )
    SELECT *
        FROM cte
        WHERE rn = 1