我有一张表:
Name | ID | Event
Smith| 1 |
Smith| 2 | Y
Smith| 3 |
Jones| 1 |
Jones| 2 | Y
Jones| 3 |
Jones| 4 | Y
我想计算每个人在每个点看到一个事件的次数,例如:
Name | ID | Event | Event Count
Smith| 1 | | 0
Smith| 2 | Y | 1
Smith| 3 | | 1
Jones| 1 | | 0
Jones| 2 | Y | 1
Jones| 3 | | 1
Jones| 4 | Y | 2
我猜我在SQL中不能这样做?如果没有,你能非常清楚我是如何在SAS(或任何适当的方式)中做到这一点的,因为我是新手!
(仅供参考,这导致我能够区分在每个事件之前或之后发生的行 - 即按事件过滤=空白,任何0发生在第一个事件之前,任何事情发生在之后,等等。可能有一个更简单的方法。)
谢谢!
答案 0 :(得分:4)
如果您想沿着SAS路线走下去,它会顺序读取数据,因此非常擅长此类问题
data have;
infile datalines missover;
input Name $ ID Event $;
datalines;
Smith 1
Smith 2 Y
Smith 3
Jones 1
Jones 2 Y
Jones 3
Jones 4 Y
;
run;
proc sort data=have;
by name id;
run;
data want;
set have;
by name id;
if first.name then event_count=0;
event_count+(event='Y');
run;
答案 1 :(得分:3)
您可以在查询中执行以下操作:
select Name, ID, Event,
(
select count(*)
from MyTable
where Name = t.Name
and Event = 'Y'
and ID <= t.ID
) as EventCount
from MyTable t
相关子查询会为您找到这个计数,虽然这是triangular join(SQL Server链接,但仍然适用),所以性能不是很好。
以下是显示结果的SQL Fiddle。
请注意,这几乎适用于任何RDBMS。
答案 2 :(得分:3)
SELECT Name, ID, Event, grpTotal
FROM
(
select Name,
ID,
Event,
@sum := if(@grp = Name,@sum,0) + if(`Event` = 'Y',1,0) as grpTotal,
@grp := Name
from TableName,
(select @grp := '', @sum := 0) vars
order by Name, ID
) s