簡體   English   中英

如果超過10%的結果超過mysql中的X

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM