Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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
Sql 按日期范围分组行_Sql_Sql Server_Date_Sql Server 2014 - Fatal编程技术网

Sql 按日期范围分组行

Sql 按日期范围分组行,sql,sql-server,date,sql-server-2014,Sql,Sql Server,Date,Sql Server 2014,我想知道,对于一个用户来说,在特定的秒数(比如10秒)内存在多少行。因此,根据这些数据: UserId CreatedDate 4.........2017-01-11 01:40:19:077 4.........2017-01-11 01:40:19:437 4.........2017-01-11 01:40:20:077 4.........2017-01-11 01:50:19:077 4.........2017-01-11 02:40:19:077 4.........2017-

我想知道,对于一个用户来说,在特定的秒数(比如10秒)内存在多少行。因此,根据这些数据:

UserId  CreatedDate
4.........2017-01-11 01:40:19:077
4.........2017-01-11 01:40:19:437
4.........2017-01-11 01:40:20:077
4.........2017-01-11 01:50:19:077
4.........2017-01-11 02:40:19:077
4.........2017-01-11 02:40:19:437
4.........2017-01-11 02:40:20:077
4.........2017-01-11 02:40:20:437
4.........2017-01-11 02:40:21:077
4.........2017-01-11 02:40:22:077
4.........2017-01-11 02:40:23:077
4.........2017-01-11 03:15:19:077
4.........2017-01-11 03:40:19:077
4.........2017-01-11 04:40:19:077
前三行将被分组在一起,第5-11行将被分组在一起,因为它们彼此的间隔都在10秒内

我试过这样的方法,但那只会给我两行的分组。我想知道10秒范围内的所有行

;WITH CTE AS
(
    SELECT UserId
        ,CreatedDate
        ,ISNULL(LAG(CreatedDate) OVER (Partition BY UserId ORDER BY CreatedDate), '1/1/2000') AS PriorCreatedDate
    FROM Foo
)
SELECT *
FROM CTE
WHERE DATEDIFF(SECOND,PriorCreatedDate,CreatedDate) <= 1
ORDER BY UserId, CreatedDate

这是可能的吗?

也许是这样的

范例

返回

编辑-请求的注释

如果你要执行

;with cte as (
    Select *
          ,Flg = case when datediff(SECOND,lag(CreatedDate,1,CreatedDate) over (Partition By UserID Order by CreatedDate),CreatedDate ) >=10 then 1 else 0 end
     From @YourTable
) 
Select *
      ,Grp=sum(Flg) over (partition by UserID order by CreatedDate) 
From  cte   
结果将是:


请注意Flg和Grp列。Grp列本质上是Flg列的运行总数。

彼此相隔10秒钟内的所有内容究竟意味着什么?如果一行的值为2017-01-11 01:50:00,它会在第一组中吗?第一组大约是1:40,所以不会,那将是10分钟后。它也不会以1:50:19为准,因为那是19秒之后的事情。每个用户的活动都被分解为自己的活动,例如:10秒的间隔,或者都是基于相同的主10秒的基础。完全不同的结果10秒的间隔是全局的。@BobHorn。正如您指定的问题,这需要一个递归CTE,这是相当昂贵的。您的意思是将MAX用于DateR2吗?什么是Flg?日期是什么?日期范围1?@BobHorn是的,我有…:这看起来很有效。我还不知道怎么做,哈哈,但我正在看。这并不重要,但我在最后补充了这一点,因为这才是我真正关心的:`让SUM1 DESC订购的SUM1>10个'我认为这也会起作用。这是一组通常称为SQL排序问题的解决方案。基本思想是,您需要根据SQL中未内置的某些标准对行进行排序。如果你是按天/月/年进行分组,你可以按这些增量进行分组,但因为你是按10秒增量进行分组,所以不容易处理。因此,典型的解决方案是执行类似嵌套查询的操作,该查询分配各个记录的排名/顺序,然后外部查询根据该排名进行分组。所以约翰的解决方案是用CTE来实现的。@BobHorn宾果。我们都站在巨人的肩膀上
UserID  DateR1                      DateR2                      RecCnt
4       2017-01-11 01:40:19.077     2017-01-11 01:40:20.077     3
4       2017-01-11 01:50:19.077     2017-01-11 01:50:19.077     1
4       2017-01-11 02:40:19.077     2017-01-11 02:40:23.077     7
4       2017-01-11 03:15:19.077     2017-01-11 03:15:19.077     1
4       2017-01-11 03:40:19.077     2017-01-11 03:40:19.077     1
4       2017-01-11 04:40:19.077     2017-01-11 04:40:19.077     1
;with cte as (
    Select *
          ,Flg = case when datediff(SECOND,lag(CreatedDate,1,CreatedDate) over (Partition By UserID Order by CreatedDate),CreatedDate ) >=10 then 1 else 0 end
     From @YourTable
) 
Select *
      ,Grp=sum(Flg) over (partition by UserID order by CreatedDate) 
From  cte