Sql 每天不同值的计数,不包括重复出现,直到值发生变化

Sql 每天不同值的计数,不包括重复出现,直到值发生变化,sql,sql-server,sql-server-2008,distinct,Sql,Sql Server,Sql Server 2008,Distinct,我真的很难解释这一点,所以我将尝试给出下表的格式,以及期望的结果 我有一个包含唯一ID、日期、用户ID和结果的表。我试图计算每天“正确”的结果数,但我只想根据userID列计算唯一发生率。然后,我想排除该特定用户标识的任何“Correct”后续事件,直到该用户标识的结果更改为“Success” UID Date UserID Result 1 01/01/2014 5 Correct 2 01/01/2014 5 Correct 3 02/01/2014

我真的很难解释这一点,所以我将尝试给出下表的格式,以及期望的结果

我有一个包含唯一ID、日期、用户ID和结果的表。我试图计算每天“正确”的结果数,但我只想根据userID列计算唯一发生率。然后,我想排除该特定用户标识的任何“Correct”后续事件,直到该用户标识的结果更改为“Success”

UID Date        UserID Result
1   01/01/2014  5    Correct
2   01/01/2014  5    Correct
3   02/01/2014  4    Correct
4   03/01/2014  4    Correct
5   03/01/2014  5    Incorrect
6   03/01/2014  4    Incorrect
7   05/01/2014  5    Correct
8   07/01/2014  4    Correct
9   08/01/2014  5    Success
10  08/01/2014  4    Success
基于上述数据,我希望看到以下内容:

Date        Correct Success
01/01/2014  1       0
02/01/2014  1       0
03/01/2014  0       0
05/01/2014  0       0
07/01/2014  0       0
08/01/2014  0       2
有人能帮忙吗?我正在使用SQL Server 2008

计数(不同)
大小写一起使用

select date,
       count(distinct case when result = 'Correct' then UserId end) as Correct,
       count(distinct case when result = 'Success' then UserId end) as Success
from data d
group by date
order by date;
编辑:

上述计数在所有事件中都是正确的。如果您只想计算第一个:

select date,
       count(case when result = 'Correct' and seqnum = 1 then UserId end) as Correct,
       count(case when result = 'Success' and seqnum = 1 then UserId end) as Success
from (select d.*,
             row_number() over (partition by UserId, result order by Uid) as seqnum
      from data d
     ) d;

在这种情况下,
不同的
是不必要的。

回答得好@戈登:我见过一些类似上面的问题。他们在count中使用了1而不是列名,比如“count(result='Correct'然后是1 end时的不同大小写)”。有什么区别吗?@user2315555。回答得很好,但我想问错了问题。编辑后的版本应该更接近OP想要的版本。@user2315555请查看此版本,以了解为什么有些人使用1而不是列名,特别是当该列可为空时。尽管这篇文章是针对Oracle的,但它也适用于SQL,这是行不通的。当我只想计算第一个结果时,它将计算重复出现的“正确”结果,直到该ID的下一个结果为“成功”@user2315555。对于您关于计数的问题,是的,这会产生很大的不同,因为这是
count(distinct)
。对于条件计数,我使用
sum()