Sql 如何计算连续分组的日期

Sql 如何计算连续分组的日期,sql,sql-server,Sql,Sql Server,我试图计算表中连续的日期分组。我几乎可以使用下面的查询了。但是,当月份发生变化时,会出现一个问题。以下是查询: DECLARE @Temp TABLE ( UserId nvarchar(128), DateCreated Date, DOfYear int ) INSERT INTO @Temp (UserId, DateCreated) values ('uid123', '2016-01-19'); INSERT INTO @Temp (UserId, DateCr

我试图计算表中连续的日期分组。我几乎可以使用下面的查询了。但是,当月份发生变化时,会出现一个问题。以下是查询:

DECLARE @Temp TABLE
(
    UserId nvarchar(128),
    DateCreated Date,
    DOfYear int
)
INSERT INTO @Temp (UserId, DateCreated) values ('uid123', '2016-01-19');
INSERT INTO @Temp (UserId, DateCreated) values ('uid123', '2016-01-24');
INSERT INTO @Temp (UserId, DateCreated) values ('uid123', '2016-01-28');
INSERT INTO @Temp (UserId, DateCreated) values ('uid123', '2016-01-29');
INSERT INTO @Temp (UserId, DateCreated) values ('uid123', '2016-02-01');
INSERT INTO @Temp (UserId, DateCreated) values ('uid123', '2016-02-02');
INSERT INTO @Temp (UserId, DateCreated) values ('uid123', '2016-02-03');
INSERT INTO @Temp (UserId, DateCreated) values ('uid123', '2016-02-07');
INSERT INTO @Temp (UserId, DateCreated) values ('uid123', '2016-02-19');

WITH CTE AS (
    SELECT 
        DateCreated, 
        StartDate = Dateadd(day,-ROW_NUMBER() OVER (ORDER BY DateCreated), DateCreated)
    FROM @Temp
)
SELECT 
    [LastDate] = MAX(DateCreated),
    TotalDays = COUNT(1)
FROM CTE
GROUP BY StartDate
Order By StartDate desc
结果如下:

LastDate    TotalDays
2016-02-19  1
2016-02-07  1
2016-02-03  3
2016-01-29  2
2016-01-24  1
2016-01-19  1
这个查询几乎有效,但正如您所看到的,它在2016-02-03,它应该包括1月29日,28日,这将导致5而不是3

有没有办法解决这个问题


以下是上述代码的SQL Fiddle示例:

只要创建的日期是唯一的,您的查询就可以正常工作(请记住,1月29日之后不是2月1日;)

如果DateCreated可以重复,您可能应该执行以下操作:

WITH CTE AS (
    SELECT 
        DateCreated, 
        StartDate = Dateadd(day,-ROW_NUMBER() OVER (ORDER BY DateCreated), DateCreated)
    FROM (SELECT DISTINCT DateCreated FROM @temp) t1
)
SELECT 
 [LastDate] = MAX(DateCreated),
    TotalDays = COUNT(1)
FROM CTE
GROUP BY StartDate
Order By StartDate desc

这将确保如果同一天有两个或两个以上的条目,您不会得到奇怪的结果。

只要创建的日期是唯一的,您的查询就可以正常工作(请记住,1月29日之后不是2月1日;)

如果DateCreated可以重复,您可能应该执行以下操作:

WITH CTE AS (
    SELECT 
        DateCreated, 
        StartDate = Dateadd(day,-ROW_NUMBER() OVER (ORDER BY DateCreated), DateCreated)
    FROM (SELECT DISTINCT DateCreated FROM @temp) t1
)
SELECT 
 [LastDate] = MAX(DateCreated),
    TotalDays = COUNT(1)
FROM CTE
GROUP BY StartDate
Order By StartDate desc

如果同一天有两个或两个以上的条目,这将确保您不会得到奇怪的结果。

错误。。。这里到底出了什么问题?1月29日后的第二天是1月30日(然后是1月31日),而不是2月1日……事实上,像这样使用-ROW_数字可能不会给你想要的东西。。只是不小心在这里工作。哇,一定是熬夜太晚了。谢谢你指出我的愚蠢:)。我有一个二月的日历,我在一月的日期工作。再次感谢。对如何改进查询有什么建议吗?DateCreated在您的实际数据中是唯一的吗?错误。。。这里到底出了什么问题?1月29日后的第二天是1月30日(然后是1月31日),而不是2月1日……事实上,像这样使用-ROW_数字可能不会给你想要的东西。。只是不小心在这里工作。哇,一定是熬夜太晚了。谢谢你指出我的愚蠢:)。我有一个二月的日历,我在一月的日期工作。再次感谢。关于如何改进查询有什么建议吗?DateCreated在您的实际数据中是唯一的吗?谢谢Dan,感谢您的帮助并感谢关于重复日期的提示。谢谢Dan,感谢您的帮助并感谢关于重复日期的提示。