0

memberid 1が値1の4倍であっても、最も連続する値が1のメンバーを取得したいので、sqlにmemberid 2を返させようとしています。

memberid position createdat
======== ======== =========
1        1         9/1/2001
1        1         8/1/2001
2        1         7/1/2001
2        1         6/1/2001
2        1         5/1/2001
1        1         4/1/2001
1        1         3/1/2001

何百万回も助けてくれてありがとう。

4

1 に答える 1

1

パラメーターをカウンターとして使用する必要があります。以下では、メンバーが前の行と同じである限り (order by で定義されているように)、@r は行ごとにインクリメントされます。同じメンバーでない場合、@r は 1 にリセットされます。

SELECT  MemberID
FROM    (   SELECT  MemberID,
                    Position,
                    CreateDat,
                    @r:=IF(@m = MemberID, @r + 1, 1) AS Consec,
                    @m:= MemberID
            FROM    T,
                    (SELECT @r:= 0) r,
                    (SELECT @m:= 0) m
            ORDER BY CreateDat DESC
        ) t
ORDER BY Consec DESC
LIMIT 1;

SQL Fiddle の例

編集

少し調整するだけで、連続した期間の開始時刻と終了時刻など、もう少し多くの情報を取得できます。

SELECT  MemberID, FirstCreateDat, CreateDat, Consec
FROM    (   SELECT  MemberID,
                    Position,
                    CreateDat,
                    @r:=IF(@m = MemberID, @r + 1, 1) AS Consec,
                    @d:=IF(@m = MemberID, @d, CreateDat) AS FirstCreateDat,
                    @m:= MemberID
            FROM    T,
                    (SELECT @r:= 0) r,
                    (SELECT @m:= 0) m,
                    (SELECT @d:= CAST(NULL AS DATETIME)) d
            ORDER BY CreateDat DESC
        ) t
ORDER BY Consec DESC
LIMIT 1;

SQL Fiddle の例

于 2013-09-26T22:10:24.830 に答える