msyql 分组查询

目的:求一定时间内的每分钟(按分钟分组),每分钟数据取5个最大的值。然后把他们求和列出
1、按时间分组,每分钟取5个最大值

SELECT
    a.*
FROM
    device_raw_data_voice a
WHERE
    substr(activeTime, 1, 16) BETWEEN '2017-12-14 14:53'
AND '2017-12-14 15:55'
AND EXISTS (
    SELECT
        count(*)
    FROM
        device_raw_data_voice
    WHERE
        substr(activeTime, 1, 16) BETWEEN '2017-12-14 14:53'
    AND '2017-12-14 15:55'
    AND substr(activeTime, 1, 16) = substr(a.activeTime, 1, 16)
    AND wave > a.wave
    HAVING
        Count(*) < 5
)
ORDER BY
    a.wave DESC
select a.* from device_raw_data_voice a //明细数据
where substr(activeTime,1,16) between '2017-12-14 14:53' and '2017-12-14 15:53' //区间范围写两遍是为了减少数据量,运行的能快点
and exists ( //这里边是判断a表中的当前条内的wave。比它大的是不是有5个以内条数。比如说这条里的wave在这一分钟内只有一条比它大的就说明它是第二大的
select count(*) //count(*) 就是统计有多少条比它大的
from device_raw_data_voice where substr(activeTime,1,16) between '2017-12-14 14:53' and '2017-12-14 15:53' //为了减少数据量,加快运行速度
and substr(activeTime,1,16) = substr(a.activeTime,1,16) and wave > a.wave //因为要计算比它大的有多少条 所以是>
having Count(*) < 5 //5 就是 0 1 2 3 4 都满足条件 共5条
) order by a.wave desc

2、求出一定时间内每分钟5个最大值的和

SELECT
    substr(a.activeTime, 1, 16),
    sum(a.wave)
FROM
    device_raw_data_voice a
WHERE
    substr(a.activeTime, 1, 16) BETWEEN '2017-12-14 14:53'
AND '2017-12-14 15:53'
AND EXISTS (
    SELECT
        count(*)
    FROM
        device_raw_data_voice
    WHERE
        substr(activeTime, 1, 16) BETWEEN '2017-12-14 14:53'
    AND '2017-12-14 15:53'
    AND substr(activeTime, 1, 16) = substr(a.activeTime, 1, 16)
    AND wave > a.wave
    HAVING
        Count(*) < 5
)
GROUP BY
    substr(a.activeTime, 1, 16)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值