3

我有一张像这样的桌子:

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 中执行此操作(或任何合适的方式),因为我是新手!

(仅供参考,这使我能够区分每个事件之前或之后发生的行 - 即按 Event = 空白过滤,在第一个事件之前发生任何 0,之后发生任何 1,等等。可能有一种更简单的方法来做这个。)

谢谢!

4

3 回答 3

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;
于 2013-03-15T16:43:46.757 回答
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

相关子查询会为您找到此计数,尽管这有点像三角连接(SQL Server 链接,但仍然适用),因此性能并不出色。

这是显示结果的SQL Fiddle

请注意,这几乎适用于任何 RDBMS。

于 2013-03-15T15:32:04.363 回答
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
于 2013-03-15T15:37:55.930 回答