2009-09-17 69 views
0

我有这样的表称为Table1如下: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 

我试图返回计数的MIN(Date) 30天之间倍MIN(Date)这是DATEADD(day,30,MIN(DATE))后的数字结果。因此,这将是这个样子:

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 2009-09-17 11:59:27

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