[英]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.