Sql server 根据日期将数据集拆分为组+;计数[MSSQL 2012]
我在SQL Server 2012中有一个数据集,需要遵循以下原则: “席位”允许在6个月内从第一个结果开始计算8个结果。如果自第一次结果之日起6个月内有超过8项结果,则给出一个新的“席位” 如果从第一个结果的日期起6个月内创建了一个结果,则会给出一个新的“席位” 因此,我有以下数据: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
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个月,则为新组。