COUNT с интервалами дат

У меня есть эта таблица с именем Table1 следующим образом:

    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))

person super9    schedule 17.09.2009    source источник


Ответы (3)


Попробуй это

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
person Adriaan Stander    schedule 17.09.2009

Я думаю, вам нужно будет использовать подзапрос, чтобы получить минимальную дату. Я показал это ниже как отдельный запрос к переменной, так как я, вероятно, превратил бы это в функцию с табличным значением.

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)
person tvanfosson    schedule 17.09.2009

Я бы сделал это так:

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
person D'Arcy Rittich    schedule 17.09.2009