代码之家  ›  专栏  ›  技术社区  ›  SkyeBoniwell

按不同列(包括时差)分组的查询

  •  1
  • SkyeBoniwell  · 技术社区  · 6 年前

    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分钟或更短时间内的游戏组合在一起…因此分组因素是游戏组、游戏日期以及游戏开始时间和游戏结束时间之间的30分钟差。。。

    • 附表1为:初中,蓝#红;蓝色和红色;蓝绿,10/1,8:00至 10:30
    • 课程表2是:大一,棕色,紫色;黑白相间;10/1, 12:00
    • 课程表3:大一,黄粉,10/3,3:45到5:00
    • 附表5为:Sophmore,粉红#红色;绿紫色,10/4,7:30到9:00
    1 回复  |  直到 6 年前
        1
  •  1
  •   Tab Alleman    6 年前

    你真正需要做的是结合使用各种方法来解决常见问题。

    您首先需要使用“间隙和孤岛”方法来获得如下所示的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中使用“间隙和孤岛”解决方案计算的人工列。同一组的所有比赛,在同一天,比前一天少于30分钟 end 到下一个 start 将共享相同的 组序列

    然后从CTE中选择,按 Group , Date ,和 组序列 Games 列,并建立您的 Time Range MIN(Start) 以及 MAX(End) .