如果超过10%的结果在mysql中超过X.

时间:2016-09-28 19:02:19

标签: 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查询完成,你可以与我分享该查询吗?

我显然没有明白我的问题。

我正在寻找的结果是一个真或假。

如果建筑物/日期组合的结果超过10%超过X(比如说80%),那么显示为true,或者某些标志等于true。

已知字段将构建和日期。该位置不相关,可以忽略。因此,如果建筑物(123)和日期(2016-04-08)的输入超过表中具有该建筑物编号和日期大于X(例如80)的条目的10%。唯一要测试的数据是那个建筑物和日期。所以查询将以:

结束
where building_id=`123` AND date =`2016-04-08`

我不是在寻找平均值或中位数。我不希望看到10%的数据列表。我只是在寻找真假。

2 个答案:

答案 0 :(得分:0)

您可以使用条件聚合,如下所示:

select building, date,
       (case when avg(temperature > x) > 0.1 then 'Y' else 'N' end) as flag
from t
group by building, date;

答案 1 :(得分:0)

要返回建筑物和日期,并为该日期内该建筑物的10%以上读数超过给定值X的行“创建一个标志”...

 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',也可以完成。

同样,如果没有你期望返回的结果集的示例,(没有我们可以比较结果集的实际规范),我们只是在猜测。