Sql 每天不同值的计数,不包括重复出现,直到值发生变化
我真的很难解释这一点,所以我将尝试给出下表的格式,以及期望的结果 我有一个包含唯一ID、日期、用户ID和结果的表。我试图计算每天“正确”的结果数,但我只想根据userID列计算唯一发生率。然后,我想排除该特定用户标识的任何“Correct”后续事件,直到该用户标识的结果更改为“Success”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
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()
。