我有一个数据库表,其中包含许多建筑物中许多位置的温度读数列表。如果一个建筑物中超过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%的数据列表。我只是在寻找真假。
答案 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'
,也可以完成。
同样,如果没有你期望返回的结果集的示例,(没有我们可以比较结果集的实际规范),我们只是在猜测。