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,感谢您的帮助并感谢关于重复日期的提示。