2016-07-08 9 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

매우 효과적인 방법 중 하나는 각 날짜 이후 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

그냥 확인 : 나는 여전히 '선전되지 않은 선행 및 현재 행 사이의 행'이 필요합니까? 그것은 당신의 대답이 아니지만 그것이되어야한다고 생각합니다. –

+0

@ A.Stam. . . '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) 
    
    관련 문제