2016-07-08 14 views
0

ログインイベントに関する情報を含むテーブルがあります。ユーザーがログインするたびに、ユーザーと日付を含むレコードが追加されます。私はそのテーブル内で、ユーザーが過去31日間にログインした回数(現在の試行を含む)を保持する新しい列を計算したいと考えています。設定時間枠のSQLローリングサマリー統計

UserID Date   LoginsInPast31Days 
-------- ------------- -------------------- 
    1  01-01-2012  1 
    2  02-01-2012  1 
    2  10-01-2012  2 
    1  25-01-2012  2 
    2  03-02-2012  2 
    2  22-03-2012  1 

は私がログイン試行の合計金額を計算する方法を知っている:これは私のテーブルには、私が追加したい列を含め、どのように見えるかの簡易版である私はCOUNT(*) OVER (PARTITION BY UserId ORDER BY Date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)を使用すると思います。ただし、期間を過去31日間に制限したい。私の推測では、UNBOUNDED PRECEDINGを変更する必要がありますが、正しい量の行を選択するように変更するにはどうすればよいですか?

+1

は何データベースを使用していますか? –

+0

SQL Server 2012、すぐに2016にアップグレードする予定です。 –

答えて

1

非常に効率的な方法の1つは、各日付の30日後にレコードを追加することです。それは次のようになります。

select userid, dte, 
     sum(inc) over (partition by userid order by dte) as LoginsInPast31Days 
from ((select distinct userid, logindate as dte, 1 as inc from logins) union all 
     (select distinct userid, dateadd(day, 31, dte, -1 as inc from logins) 
    ) l; 
+0

これは天才です!本当にありがとう。 –

+0

ちょうどチェック:私はまだ '不定期の矯正と現在の行との間の行 'が必要ですか?それはあなたの答えではありませんが、私はそれがすべきだと思います。 @ A.Stam。 –

+0

。 。 。 'order by'を使うと、暗黙的です。節が必要なデータベースがいくつかあります(Redshiftではそうだと思いますが)が、SQL Serverではありません。 –

0

あなたはほとんどそこにいる、2つの調整:あなたが第二

  • を選択する行数を知っているので、

    • まず、ユーザ、日付ごとにグループに確認してください、あなた使用する前のレコードの数を制限することはできないので、 'ROWS BETWEEN CURRENT ROWと31 FOLLOWING'を使用する必要があります。降順ソート順を使用すると、必要な結果が得られます。

    は、これらのヒントを組み合わせて、あなたが得るでしょう:あなたは

    SELECT SUM(COUNT(*)) OVER (
          PARTITION BY t.userid_KEY 
          ORDER BY CAST(t.login_ts AS DATE) DESC 
          ROWS BETWEEN CURRENT ROW AND 31 FOLLOWING 
         ) 
    FROM table AS t 
    GROUP BY t.userid, CAST(t.login_ts AS DATE) 
    
  • 関連する問題