根据计数条件对多行进行分组和填充

Group and Stuff multiple rows based on Count condition

我有一个脚本 运行 每 10 分钟和 returns table 过去 24 小时的事件(由脚本标记 运行 时间)

ID      Name                TimeOfEvent                 EventCategory       TeamColor
1       Verlene Bucy        2015-01-30 09:10:00.000         1                   Blue
2       Geneva Rendon       2015-01-30 09:20:00.000         2                   Blue
3       Juliane Hartwig     2015-01-30 09:25:00.000         3                   Blue
4       Vina Dutton         2015-01-30 12:55:00.000         2                   Red
5       Cristin Lewis       2015-01-30 15:50:00.000         2                   Red
6       Reiko Cushman       2015-01-30 17:10:00.000         1                   Red
7       Mallie Temme        2015-01-30 18:35:00.000         3                   Blue
8       Keshia Seip         2015-01-30 19:55:00.000         2                   Blue
9       Rosalia Maher       2015-01-30 20:35:00.000         3                   Red
10      Keven Gabel         2015-01-30 21:25:00.000         3                   Red

现在我想 select 两组基于这些条件的名称:

1) Select 来自同一事件类别的名称在过去 24 小时内有 4 条或更多条记录。

2) Select 来自相同 EventCategory 和相同 TeamColor 的名称在过去 1 小时内有 2 条或更多条记录。

所以我的结果是:

4+per24h: Geneva Rendon, Vina Dutton, Cristin Lewis, Keshia Seip        EventCategory = 2
4+per24h: Juliane Hartwig, Mallie Temme, Rosalia Maher, Keven Gabel     EventCategory = 3
2+per1h:  Rosalia Maher, Keven Gabel                                    EventCategory = 3, TeamColor = Red

第一个,我是这样写的:

SELECT mt.EventCategory, MAX(mt.[name]), MAX(mt.TimeOfEvent), MAX(mt.TeamColor)
  FROM #mytable mt
GROUP BY mt.EventCategory
HAVING COUNT(mt.EventCategory) >= 4

因为我不关心实际时间,只要它是过去 24 小时内的时间(而且一直如此),但我无法将名称塞进一行。

第二部分,我不知道该怎么做。因为结果需要同时具有相同的 EventCategory 和 TeamColor 并且还受到一小时括号的限制。

这是可能的,但您将两个不同的问题混为一谈。在这里您可以找到它们与 UNION:

的组合

只需将其粘贴到一个空查询中 window 并执行。适应您的需求:

DECLARE @tbl TABLE(ID INT,Name VARCHAR(100),TimeOfEvent DATETIME,EventCategory INT,TeamColor VARCHAR(10));
INSERT INTO @tbl VALUES
 (1,'Verlene Bucy','2015-01-30T09:10:00.000',1,'Blue')
,(2,'Geneva Rendon','2015-01-30T09:20:00.000',2,'Blue')
,(3,'Juliane Hartwig','2015-01-30T09:25:00.000',3,'Blue')
,(4,'Vina Dutton','2015-01-30T12:55:00.000',2,'Red')
,(5,'Cristin Lewis','2015-01-30T15:50:00.000',2,'Red')
,(6,'Reiko Cushman','2015-01-30T17:10:00.000',1,'Red')
,(7,'Mallie Temme','2015-01-30T18:35:00.000',3,'Blue')
,(8,'Keshia Seip','2015-01-30T19:55:00.000',2,'Blue')
,(9,'Rosalia Maher','2015-01-30T20:35:00.000',3,'Red')
,(10,'Keven Gabel','2015-01-30T21:25:00.000',3,'Red');

WITH Extended AS
(
    SELECT *
          ,DATEDIFF(MINUTE,'2015-01-30T21:26:00.000',TimeOfEvent) AS MinuteDiff --use GETDATE() here...
          ,COUNT(*) OVER(PARTITION BY EventCategory) AS CountCategory
    FROM @tbl AS tbl
)
,Filtered24Hours AS
(
    SELECT *
    FROM Extended
    WHERE CountCategory >=4
)
,Filtered60Mins AS
(
    SELECT *
    FROM Extended
    WHERE MinuteDiff >=-60 
      AND CountCategory >=2
)
SELECT DISTINCT (SELECT COUNT(*) FROM Filtered24Hours AS x WHERE x.EventCategory=outerSource.EventCategory) AS CountNames
               ,'per24h' AS TimeIntervall
               ,STUFF((
                        SELECT ' ,' + innerSource.Name 
                        FROM Filtered24Hours AS innerSource
                        WHERE innerSource.EventCategory=outerSource.EventCategory
                        ORDER BY innerSource.TimeOfEvent
                        FOR XML PATH('') 
                       ),1,2,'') AS Names 
              ,EventCategory 
              ,NULL
FROM Filtered24Hours AS outerSource
UNION 
SELECT DISTINCT (SELECT COUNT(*) FROM Filtered60Mins AS x WHERE x.EventCategory=outerSource.EventCategory) 
               ,'per1h'
               ,STUFF((
                        SELECT ' ,' + innerSource.Name 
                        FROM Filtered60Mins AS innerSource
                        WHERE innerSource.EventCategory=outerSource.EventCategory
                        ORDER BY innerSource.TimeOfEvent
                        FOR XML PATH('') 
                       ),1,2,'') 
              ,EventCategory 
              ,TeamColor
FROM Filtered60Mins AS outerSource

结果

Count Interv    Names                                                     Category  Team
4     per24h    Geneva Rendon ,Vina Dutton ,Cristin Lewis ,Keshia Seip    2         NULL
4     per24h    Juliane Hartwig ,Mallie Temme ,Rosalia Maher ,Keven Gabel 3         NULL
2     per1h     Rosalia Maher ,Keven Gabel                                3         Red