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でこれを行う方法(または適切な方法)を非常に明確にできますか?

(参考までに、これにより、各イベントの前後に発生する行を区別できるようになります。つまり、イベント=空白でフィルター処理し、最初のイベントの前に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フィドルです。

これは事実上すべての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 に答える