Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 以日期间隔计数_Tsql_Count - Fatal编程技术网

Tsql 以日期间隔计数

Tsql 以日期间隔计数,tsql,count,Tsql,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(日期)和MIN(日期)之后30天之间的次数,即DATEADD(day,30,MIN

我将此表称为
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(日期)
MIN(日期)
之后30天之间的次数,即
DATEADD(day,30,MIN(日期))
。所以它看起来像这样:

    UserID   Count
    1        3 
    2        2
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
下面的代码是错误的,但它表达了我试图实现的目标:

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

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

我认为您需要使用子查询来获取最短日期。我在下面展示了它 作为一个单独的查询转换为一个变量,我可能会将其转换为一个表值函数

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)

我会这样做:

    UserID   Count
    1        3 
    2        2
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
选择一个.UserID,count(DDate-MinDate时的大小写)