Sql server 根据日期将数据集拆分为组+;计数[MSSQL 2012]

Sql server 根据日期将数据集拆分为组+;计数[MSSQL 2012],sql-server,sql-server-2012,grouping,Sql Server,Sql Server 2012,Grouping,我在SQL Server 2012中有一个数据集,需要遵循以下原则: “席位”允许在6个月内从第一个结果开始计算8个结果。如果自第一次结果之日起6个月内有超过8项结果,则给出一个新的“席位” 如果从第一个结果的日期起6个月内创建了一个结果,则会给出一个新的“席位” 因此,我有以下数据: User DateCreated ---- ------------- User1 2015-01-01 16:05:00 User1 2015-01-02 16:05:00 User1

我在SQL Server 2012中有一个数据集,需要遵循以下原则:

“席位”允许在6个月内从第一个结果开始计算8个结果。如果自第一次结果之日起6个月内有超过8项结果,则给出一个新的“席位”

如果从第一个结果的日期起6个月内创建了一个结果,则会给出一个新的“席位”

因此,我有以下数据:

User    DateCreated
----    -------------
User1   2015-01-01 16:05:00
User1   2015-01-02 16:05:00
User1   2015-01-03 16:05:00
User1   2015-01-04 16:05:00
User1   2015-01-05 16:05:00
User1   2015-01-06 16:05:00
User1   2015-01-07 16:05:00
User1   2015-01-08 16:05:00
User1   2015-01-09 16:05:00
User1   2015-01-10 13:25:00
User1   2015-01-11 13:25:00
User1   2015-01-12 13:25:00
User1   2015-09-01 13:00:00 
User1   2016-04-01 13:00:00
User2   2015-01-01 13:25:00 
User2   2015-01-02 13:25:00 
User2   2015-09-01 13:25:00 
User2   2016-01-01 13:25:00 
User2   2016-05-01 13:25:00 
User3   2015-01-01 16:05:00 
User3   2015-01-02 16:05:00     
User3   2015-01-03 16:05:00     
根据上述规则,他们可以分为以下“组”

最终可能成为

User        Seats
----        -----
User1       4
User2       3
User3       1
在SQL查询中如何实现这一点(如果有的话)

--

好的,评论已经说到一半了,我修改了上面的预期输出来解释差异,因为我的解释不正确


我不认为我需要一个总和,更多的是一个运行总数

这里有一个方法

;WITH cte
     AS (SELECT *,
         ( ( Row_number()OVER(partition BY [User] 
             ORDER BY [DateCreated]) - 1 ) / 8 ) + 1 AS rn, -- To group 8 records per user
                Lag([DateCreated])OVER(partition BY [User] ORDER BY [DateCreated])                     AS PREV_DATE
         FROM   Yourtable),
     INTR
     AS (SELECT *,
                Sum(Datediff(mm, Isnull(PREV_DATE, [DateCreated]), [DateCreated]))
                  OVER(
                    partition BY [User]
                    ORDER BY [DateCreated]) AS GRP -- To group the user based on Date difference 
         FROM   cte)
SELECT [User],[DateCreated],
       Dense_rank()
         OVER(
           PARTITION BY [User]
           ORDER BY rn, GRP) AS Groups
FROM   INTR 

样本数据

CREATE TABLE Yourtable
    ([User] varchar(5), [DateCreated] datetime)
;

INSERT INTO Yourtable
    ([User], [DateCreated])
VALUES
    ('User1', '2015-01-01 16:05:00'),
    ('User1', '2015-01-02 16:05:00'),
    ('User1', '2015-01-03 16:05:00'),
    ('User1', '2015-01-04 16:05:00'),
    ('User1', '2015-01-05 16:05:00'),
    ('User1', '2015-01-06 16:05:00'),
    ('User1', '2015-01-07 16:05:00'),
    ('User1', '2015-01-08 16:05:00'),
    ('User1', '2015-01-09 16:05:00'),
    ('User1', '2015-01-10 13:25:00'),
    ('User1', '2015-01-11 13:25:00'),
    ('User1', '2015-01-12 13:25:00'),
    ('User2', '2015-01-01 13:25:00'),
    ('User2', '2015-01-02 13:25:00'),
    ('User2', '2015-09-01 13:25:00'),
    ('User2', '2016-05-01 13:25:00')
;
+-------+-------------------------+--------+
| User  |       DateCreated       | Groups |
+-------+-------------------------+--------+
| User1 | 2015-01-01 16:05:00.000 |      1 |
| User1 | 2015-01-02 16:05:00.000 |      1 |
| User1 | 2015-01-03 16:05:00.000 |      1 |
| User1 | 2015-01-04 16:05:00.000 |      1 |
| User1 | 2015-01-05 16:05:00.000 |      1 |
| User1 | 2015-01-06 16:05:00.000 |      1 |
| User1 | 2015-01-07 16:05:00.000 |      1 |
| User1 | 2015-01-08 16:05:00.000 |      1 |
| User1 | 2015-01-09 16:05:00.000 |      2 |
| User1 | 2015-01-10 13:25:00.000 |      2 |
| User1 | 2015-01-11 13:25:00.000 |      2 |
| User1 | 2015-01-12 13:25:00.000 |      2 |
| User2 | 2015-01-01 13:25:00.000 |      1 |
| User2 | 2015-01-02 13:25:00.000 |      1 |
| User2 | 2015-09-01 13:25:00.000 |      2 |
| User2 | 2016-05-01 13:25:00.000 |      3 |
+-------+-------------------------+--------+
结果

CREATE TABLE Yourtable
    ([User] varchar(5), [DateCreated] datetime)
;

INSERT INTO Yourtable
    ([User], [DateCreated])
VALUES
    ('User1', '2015-01-01 16:05:00'),
    ('User1', '2015-01-02 16:05:00'),
    ('User1', '2015-01-03 16:05:00'),
    ('User1', '2015-01-04 16:05:00'),
    ('User1', '2015-01-05 16:05:00'),
    ('User1', '2015-01-06 16:05:00'),
    ('User1', '2015-01-07 16:05:00'),
    ('User1', '2015-01-08 16:05:00'),
    ('User1', '2015-01-09 16:05:00'),
    ('User1', '2015-01-10 13:25:00'),
    ('User1', '2015-01-11 13:25:00'),
    ('User1', '2015-01-12 13:25:00'),
    ('User2', '2015-01-01 13:25:00'),
    ('User2', '2015-01-02 13:25:00'),
    ('User2', '2015-09-01 13:25:00'),
    ('User2', '2016-05-01 13:25:00')
;
+-------+-------------------------+--------+
| User  |       DateCreated       | Groups |
+-------+-------------------------+--------+
| User1 | 2015-01-01 16:05:00.000 |      1 |
| User1 | 2015-01-02 16:05:00.000 |      1 |
| User1 | 2015-01-03 16:05:00.000 |      1 |
| User1 | 2015-01-04 16:05:00.000 |      1 |
| User1 | 2015-01-05 16:05:00.000 |      1 |
| User1 | 2015-01-06 16:05:00.000 |      1 |
| User1 | 2015-01-07 16:05:00.000 |      1 |
| User1 | 2015-01-08 16:05:00.000 |      1 |
| User1 | 2015-01-09 16:05:00.000 |      2 |
| User1 | 2015-01-10 13:25:00.000 |      2 |
| User1 | 2015-01-11 13:25:00.000 |      2 |
| User1 | 2015-01-12 13:25:00.000 |      2 |
| User2 | 2015-01-01 13:25:00.000 |      1 |
| User2 | 2015-01-02 13:25:00.000 |      1 |
| User2 | 2015-09-01 13:25:00.000 |      2 |
| User2 | 2016-05-01 13:25:00.000 |      3 |
+-------+-------------------------+--------+
找出最后的结果

Select [User],Max(Groups) as Seats
From INTR 
Group by [User]

这真令人印象深刻,正是我需要处理的。如果我要按日期筛选,我可能会在从Yourtable中筛选后发现,对吗?抱歉,但我不确定日期差异分组是否有效。如果您将User2-2016-05-01 13:25:00.000更改为User2-2016-01-01 13:25:00.000,则它应属于第2组,因为它在6个月内。目前显示为3。这有意义吗?如果当前行日期比上一行日期晚6个月,则为新组。