[英]If more than 10% of results are over X in mysql
我有一個數據庫表,其中包含許多建築物中許多位置的溫度讀數列表。 我需要一個查詢,如果建築物中某日期的讀數超過10%大於X,則該查詢將為真或為假
我不是在尋找平均水平。 如果某棟建築物在某個日期進行了100次測量,其中10次超過X(例如80度),則創建一個標記。
該表的布局為
Building # location # date temperature
| 123 | 555 |2016-04-08 | 68.5 |
| 123 | 556 |2016-04-08 | 70.2 |
| 123 | 557 |2016-04-08 | 65.4 |
| 888 | 999 |2013-03 22 | 80.4 |
通常,一棟建築物將具有超過100個讀數。 表格中有數百個建築物/日期條目
可以使用單個mysql查詢完成此操作,並且可以與我共享該查詢嗎?
我顯然沒有明確我的問題。
我正在尋找的結果是單個True或False。
如果建築物/日期組合的結果中超過10%的結果超過X(例如80%),則顯示為true,或某些標志等於true。
已知字段將是建築物和日期。 位置不相關,可以忽略。 因此,考慮到建築物(123)和日期(2016-04-08)的輸入,表中超過10%的條目具有該建築物號和日期大於X(例如80)的輸入。 唯一要測試的數據是該建築物和日期的數據。 因此查詢將以以下結尾:
where building_id=`123` AND date =`2016-04-08`
我不是在尋找平均值或中位數。 我不希望看到該10%的數據列表。 我只是在尋找對與錯。
您可以使用條件聚合,如下所示:
select building, date,
(case when avg(temperature > x) > 0.1 then 'Y' else 'N' end) as flag
from t
group by building, date;
要返回建築物和日期,並為在該日期該建築物的讀數超過給定值X的10%以上的行“創建標記” ...
SELECT r.building
, DATE(r.date)
, ( SUM(r.reading > X ) > SUM(.10) ) AS _flag
FROM myreadings r
GROUP BY r.building, DATE(r.date)
由於沒有關於要返回的實際結果集的更多說明,我們只是在猜測要返回的結果集。
跟進
根據問題的更新...,以針對單個建築物和單個日期返回一行,添加WHERE子句,如問題所示。 並從SELECT列表中刪除表達式。
SELECT ( SUM(r.reading > X ) > SUM(.10) ) AS _flag
FROM myreadings r
WHERE r.building = '123'
AND r.date >= '2016-04-08'
AND r.date < '2016-04-08' + INTERVAL 1 DAY
如果沒有給定建築物和給定日期的行,則查詢將返回零行。 如果至少有一行,並且讀數大於X的行數大於總行數的10%,則查詢將返回單行,_flag的值為1(TRUE) 。 否則,查詢將返回帶有_flag的單行,其值為0(FALSE)。
如果您希望查詢返回一個行,即使表中沒有匹配的行,也可以使用更復雜的SQL語句來完成。
如果要查詢返回字符串值'TRUE'
或'FALSE'
,也可以完成此操作。
同樣,缺少您期望返回的結果集的示例 (沒有實際的規范,我們可以將結果集與之進行比較),我們只是在猜測。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.