查询按包括时差在内的不同列进行分组

时间:2018-10-01 18:15:12

标签: sql-server sql-server-2012 group-concat gaps-and-islands

我有一个简单的查询,返回了一周的足球比赛。

select game_group, game_name, game_date, game_StartTime, game_EndTime
from Games
where game_date between '10/1/2018' and '10/7/2018'

结果如下:

 Junior   | blue_red     | 10/1 | 8:00  | 8:30
 Junior   | blue_red     | 10/1 | 8:30  | 9:00
 Junior   | blue_green   | 10/1 | 9:00  | 10:30
 Freshman | brown_purple | 10/1 | 12:00 | 12:30
 Freshman | black_white  | 10/1 | 12:30 | 1:00
 Freshman | yellow_pink  | 10/3 | 3:45  | 5:00
 Senior   | blue_orange  | 10/4 | 7:00  | 7:30
 Sophmore | pink_red     | 10/4 | 7:30  | 8:30
 Sophmore | green_purple | 10/4 | 8:30  | 9:00

有没有一种方法可以操纵查询,以便按日期和时间对游戏进行分组?逻辑是,将同一组,同一日期,彼此之间或少于30分钟之内的游戏进行合并...因此分组因子为game_group,game_date和game_StartTime与game_EndTime之间的30分钟差。 ..

像这样:

  • 时刻表1是:Junior,blue_red; blue_red; blue_green,10/1,8:00 to 10:30
  • 时间表2是:大一新生,棕紫色;黑白色; 10/1,12:00 到1:00
  • 时间表3是:大一,黄粉,10 / 3、3:45至5:00
  • 时间表4是:高级,蓝橙色,10 / 4、7:00至7:30
  • 时间表5是:Sophmore,pink_red; green_purple,10 / 4、7:30至9:00

1 个答案:

答案 0 :(得分:1)

您实际需要做的是结合使用多种方法来解决常见问题。

您首先需要使用“空白和孤岛”方法来获得如下所示的CTE或派生表(使用缩写和部分示例数据来使其简短):

Group   Game     Date   Start   End    GroupSequence
Fr      B-P      10/1   12:00   12:30  1
Fr      B-W      10/1   12:30    1:00  1
Fr      Y-P      10/1    3:45    5:00  2

GroupSequence是您在CTE中使用“缺口和离岛”解决方案计算的人工列。从前一个end到后一个start少于30分钟的同一组中同一天的所有游戏将共享相同的GroupSequence

然后,您从该CTE中选择,按GroupDateGroupSequence进行分组,并使用GROUP_CONCAT技术构建Games列,并构建{ 1}}列,其中包含Time RangeMIN(Start)