zoukankan      html  css  js  c++  java
  • sql server 以10分钟分组 统计人数

    请问针对时间段从每天早上7点开始统计每十分钟人

    解决思路:

    我以前做过一个关于月份的,是说每3个月以分组,其实是一样的。不过可能啊,整体数据量大会有问题。如果你只是求一天的,那绝对没问题。
    【1】如果只是当天,那么你以当天七点为准,算当天所有时间与它的分钟差,然后group by 分钟差/10 即可
    【2】如果是全部数据的话,那么你在where里把时间段条件加上,然后找个最早的时间点为准 group by 当前时间与最早时间点的分钟差/10

    这位朋友这样是死写,本文以当天为例啊

    【1】构建个表测试一下

    【2】利用分钟差/10分组

    【3】显示不直观,转换成时间显示

    SELECT DATEDIFF( Minute, '2017-01-01 07:00:00', '2017-01-01 7:18:20')
    
    create table test104(
    id  int identity(1,1),
    [time] datetime 
    )
    insert into test104 values('20180301 07:05:05')
    insert into test104 values('20180301 07:06:05')
    insert into test104 values('20180301 07:15:05')
    insert into test104 values('20180301 07:16:05')
    insert into test104 values('20180301 07:25:05')
    insert into test104 values('20180301 07:26:05')
    insert into test104 values('20180301 07:35:05')
    insert into test104 values('20180301 07:36:05')
    insert into test104 values('20180301 07:45:05')
    insert into test104 values('20180301 07:46:05')
    insert into test104 values('20180301 07:55:05')
    insert into test104 values('20180301 07:56:05')
    
    select   dateadd(minute,DATEDIFF( Minute, '20180301 07:00:00', time)/10*10,'20180301 07:00:00' ),count(1) from test104
    group by  DATEDIFF( Minute, '20180301 07:00:00', time)/10

    方法2:利用分钟构造出想要的分钟列。

      比如  2018-03-01 07:56:05   ,构造出  2018-03-01 07:50:00

      核心思想

        (1)分钟数56拿出来,然后让其变成50

        (2)怎么变成50?--》56-56%10 = 50

        (3)怎么去掉后面的秒呢?用convert解决

    select   dateadd(minute,datepart(minute,time)%10*(-1),time )  as example_col
    , convert(char(16),   dateadd(minute,datepart(minute,time)%10*(-1),time)   ,120)+':00' as [group_time]
    ,*  from test104

    
    

      后面的分组就不用多说了,直接分就OK

    select 
        group_time,
        count(1) as [时间段内记录数],
        max(time) as [时间段内最大时间],
        min(time) as [时间段内最小时间] 
    from 
    (
        select   dateadd(minute,datepart(minute,time)%10*(-1),time )  as example_col
        , convert(char(16),   dateadd(minute,datepart(minute,time)%10*(-1),time)   ,120)+':00' as [group_time]
        ,*  from test104
    ) t 
    group by group_time

    
    

     上述2种办法适合于任意维度的时间操作

    关于本文更好的办法,直接 --但仅限于这种10分钟的

    group BY LEFT(startTime,15) 
  • 相关阅读:
    FZU Monthly-201906 tutorial
    FZU Monthly-201906 获奖名单
    FZU Monthly-201905 tutorial
    BZOJ1009 GT考试
    BZOJ2428 均分数据
    模拟退火
    BZOJ3680 吊打XXX
    BZOJ4818 序列计数
    BZOJ4103 异或运算
    BZOJ3512 DZY Loves Math IV
  • 原文地址:https://www.cnblogs.com/gered/p/8549241.html
Copyright © 2011-2022 走看看