COUNT

2009-09-17 2 views
0

다음과 같이 내가 Table1이라는 테이블이 : 나는 DATEADD(day,30,MIN(DATE))입니다 MIN(Date)MIN(Date) 30 일 사이의 시간 수를 계산 결과를 반환하려고COUNT

UserID Date 
    1  01/01/09 
    1  14/01/09 
    1  25/01/09 
    1  01/02/09 
    1  15/02/09 
    2  02/02/09 
    2  15/02/09 

. 그래서 다음과 같이 보일 것입니다 :

UserID Count 
    1  3 
    2  2 

다음이 코드는 잘못하지만 내가 달성하기 위해 노력하고 무엇을 표현 :

SELECT COUNT(1) AS Count 
FROM Table1 
GROUP BY UserID 
WHERE Date BETWEEN MIN(Date) AND DATEADD(day,30,MIN(DATE)) 

답변

1
SELECT a.UserID, COUNT(a.UserID) AS [Count] 
FROM Table1 AS a 
    INNER JOIN 
    (
     SELECT UserID, MIN([Date]) AS MinDate 
     FROM Table1 
     GROUP BY UserID 
    ) AS b 
     ON a.UserID = b.UserID 
WHERE [Date] BETWEEN MinDate AND DATEADD(day, 30, MinDate) 
GROUP BY a.UserID 
+0

환호 짝을 !!!! – super9

1

DECLARE @table TABLE(
     UserID INT, 
     DDate DATETIME 
) 

INSERT INTO @table (UserID,DDate) SELECT 1, '01 Jan 2009' 
INSERT INTO @table (UserID,DDate) SELECT 1, '14 Jan 2009' 
INSERT INTO @table (UserID,DDate) SELECT 1, '25 Jan 2009' 
INSERT INTO @table (UserID,DDate) SELECT 1, '01 Feb 2009' 
INSERT INTO @table (UserID,DDate) SELECT 1, '15 Feb 2009' 
INSERT INTO @table (UserID,DDate) SELECT 2, '02 Feb 2009' 
INSERT INTO @table (UserID,DDate) SELECT 2, '15 Feb 2009' 


SELECT t.UserID, 
     COUNT(t.UserID) 
FROM @table t INNER JOIN 
     (
      SELECT UserID, 
        MinDate, 
        DATEADD(dd, 30, MinDate) MinDataAdd30 
      FROM (
         SELECT UserID, 
           MIN(DDate) MinDate 
         FROM @table 
         GROUP BY UserID 
        ) MINDates 
     ) DateRange ON t.UserID = DateRange.UserID 
WHERE t.DDate BETWEEN DateRange.MinDate AND DateRange.MinDataAdd30 
GROUP BY t.UserID 
0

내가 '당신을 생각하십시오 최소 날짜를 얻으려면 하위 쿼리를 사용해야합니다. 나는 이것을 테이블 값 함수로 바꿀 것이므로 변수에 대한 별도의 쿼리로 아래에 표시했습니다.

DECLARE @STARTDATE DATETIME 

SELECT @STARTDATE = MIN(DATE) FROM Table1 

SELECT COUNT(1) AS Count 
FROM Table1 
GROUP BY UserID 
WHERE Date BETWEEN @STARTDATE AND DATEADD(day,30,@STARTDATE) 
0

나는 이런 식으로 할 것 :

select a.UserID, count(case when DDate - MinDate <= 30 then 1 end) as Count 
from (
    select UserID, min(DDate) MinDate 
    from Table1 
    group by UserID 
) a 
inner join Table1 t on a.UserID = t.UserID 
group by a.UserID