根据每天2列的总和选择前n个记录

时间:2018-02-26 09:19:57

标签: mysql

我有一个包含样本数据的表格如下:

Date                | hostname   |bytesIn|bytesOut|
2018/02/26 11:57:37 | abc.com    | 100   | 500
2018/02/26 11:57:37 | abc.com    | 50    | 500
2018/02/25 11:57:37 | xyz.com    | 100   | 300
2018/02/25 11:57:37 | abc.com    | 100   | 500
2018/02/25 11:57:37 | def.com    | 200   | 500

我想根据每天的总字节数(bytesIn + bytesOut)选择前n个记录。我需要计算bytesIn和bytesOut列的总和并格式化Date列(省略hh:mm:ss part)以获取特定主机名的每日总和。然后我需要根据总字节数每天获得前n个主机名。例如,我需要每天使用哪个主机名消耗带宽。

我看到了类似的问题但无法应用我的问题的答案。 我怎样才能获得这些记录?

预期的输出应该是这样的(根据带宽的前两个主机名,让我们说):

2018/02/26 | abc.com | 600
2018/02/26 | xyz.com | 550
2018/02/25 | def.com | 750
2018/02/25 | qwe.com | 300
2018/02/24 | asd.com | 550
2018/02/24 | sdf.com | 520

1 个答案:

答案 0 :(得分:0)

以下查询对您有所帮助,

select hostname, Dates, totalBytes
from  
    ( select @prev := '', @n := 0 ) init
join  
    ( select @n := if( Dates != @prev, 1, @n + 1) AS n,
             @prev := Dates,
             hostname, Dates, totalBytes
      from ( select hostname,DATE_FORMAT(dates, '%Y/%m/%d') as Dates,
                    (sum(bytesIn) + sum(bytesOut)) totalBytes
             from your_table
             group by hostname,dates
             order by  Dates desc, totalBytes desc
           ) T1
     ) T2       
where n <= 2

n指定每天的记录数。

Click here for SQL Fiddle Demo