[英]How to combine two sql queries from same table
我在表中有以下(示例)数据
值,日期,设备
我使用数据进行简单的SLA计算,即在工作时间内多少次数据低于某个阈值。
目前,我运行以下两个查询,如下所示
select count(*), DATE(times) from SLA where device='some-dev' and DATE(times) between '2013-05-01' and '2013-05-31' and TIME(times) between '06:00:00' and '18:00:00' and value <150 group by DATE(times);
select count(*), DATE(times) from SLA where device='some-dev' and DATE(times) between '2013-05-01' and '2013-05-31' and TIME(times) between '06:00:00' and '18:00:00' group by DATE(times);
因此,有两个查询,一个查询没有值<数字,一个查询没有值。
有几个问题,是否有办法将它们全部合并到一个查询中,所以我可以看到总数据点和小于阈值的数据点的计数? 基本上返回三列,一列带有计数,一列带有低于阈值的计数和日期
除此之外,有没有一种简单的方法可以告诉mysql在返回数据时忽略周末?
谢谢,
使用UNION
运算符。
更新后的查询将如下所示:
(select count(*), DATE(times) from SLA where device='some-dev' and DATE(times) between '2013-05-01' and '2013-05-31' and TIME(times) between '06:00:00' and '18:00:00' and value <150 group by DATE(times))
UNION
(select count(*), DATE(times) from SLA where device='some-dev' and DATE(times) between '2013-05-01' and '2013-05-31' and TIME(times) between '06:00:00' and '18:00:00' group by DATE(times));
如您所写,如果需要三列 (两个计数和一个日期),请使用subselect而不是union:
select
(select count(*) from SLA where device='some-dev' and DATE(times) = DATE(s.times) and TIME(times) between '06:00:00' and '18:00:00' and value <150),
count(*),
DATE(s.times)
from SLA s
where device='some-dev' and DATE(times) between '2013-05-01' and '2013-05-31' and TIME(times) between '06:00:00' and '18:00:00' group by DATE(times)
我没有测试上面的查询,因此可能需要进行一些调整,但是请参见一个简化的工作示例 。
编辑:刚刚用一个(甚至)更有意义的查询更新了链接的小提琴(一次)。
select count(*), DATE(time) from SLA where (device='some-dev' and DATE(time) between '2013-05-01' and '2013-05-31' and TIME(times) between '06:00:00' and '18:00:00' and value <150 group by DATE(time)) or (device='some-dev' and DATE(times) between '2013-05-01' and '2013-05-31' and TIME(time) between '06:00:00' and '18:00:00' group by DATE(time));
怎么样:
select count(*), DATE(times) from SLA
where (device='some-dev' and DATE(times) between '2013-05-01' and '2013-05-31' and TIME(times) between '06:00:00' and '18:00:00' and value <150 group by DATE(times))
or (device='some-dev' and DATE(times) between '2013-05-01' and '2013-05-31' and TIME(times) between '06:00:00' and '18:00:00' group by DATE(times));
我使用的是ms-sql,但大概可以执行以下操作:
select count(*), DATE(times), SUM(CASE WHEN value <150 THEN 1 ELSE 0 END)
from SLA
where device='some-dev'
and DATE(times) between '2013-05-01' and '2013-05-31'
and TIME(times) between '06:00:00' and '18:00:00'
group by DATE(times);
在mysql中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.