2017-10-11 4 views
1

行内の連続する(特定の)一致エントリをカウントしますが、それ以外の場合はゼロから開始します。行が空でない限り、データベース行の一致するエントリ数をカウントします。

私の考えは、誰かが(私の場合は15分で)時間枠内で何回ログイン試行をしたのかを見てそれに応じて行動することです。例えば(簡体字表):

Row: User_id | Loginstatus | Timestamp 
    5   Attempt  most recent 
    5   Attempt  . 
    5   Logoff   . 
    5   Login   . 
    5   Attempt  . 
    5   Attempt  . 
    5   Attempt  . 
    5   Attempt  . 
    5   Logoff   . 
    5   Login   . 
    5   Logoff   . 
    5   Login   . 

私の選択は、今生成する必要があります:2

私がこれまでに得たもの:

select count(Loginstatus) Result from Userlog 
where User_Id = 5 
and Loginstatus = 'ATTEMPT' 
and Timestamp > Systimestamp - Interval '15' Minute; 

が、これは残念ながら、すべての試行をカウントします。私は任意の助けのための幸せですし、あなたがGROUP BYを使用する必要があり、事前に

+0

使用しているデータベースで質問をタグ付けします。 –

+0

申し訳ありません、私はそれを言及するのを忘れました。あなたのヒントをありがとう –

答えて

0

あなたは、隣接する配列を同定するために、行番号の違いを使用することができます。

select user_id, count(*) as num_consecutive 
from (select ul.*, 
      row_number() over (partition by user_id order by timestamp) as seqnum_u, 
      row_number() over (partition by user_id, loginstatus order by timestamp) as seqnum_us 

     from Userlog ul 
     where User_Id = 5 and Timestamp > Systimestamp - Interval '15' Minute; 
    ) ul 
where Loginstatus = 'ATTEMPT' 
group by user_id, (seqnum_u - seqnum_us); 

場合1つの値が必要な場合は、次のものを追加できます。

order by num_consecutive desc 
fetch first 1 row only 
+0

パーフェクト!本当にありがとうございました:) –

0

をありがとう:

SELECT [LoginStatus]=MAX(Loginstatus), [Count]=count(Loginstatus) 
FROM Userlog 
WHERE User_Id = 5 
AND Loginstatus = 'ATTEMPT' 
AND Timestamp > Systimestamp - Interval '15' Minute; 
GROUP BY (Loginstatus) 
関連する問題