我有下表:
id r_date time_stamp licenseid storeid deviceid value
1 2015-06-12 17:36:15 lic0001 1 0add 52
2 2015-06-12 17:36:15 lic0002 1 0add 54
3 2015-06-12 17:36:15 lic0003 1 0add 53
4 2015-06-12 17:36:21 lic0001 1 0add 54
5 2015-06-12 17:36:21 lic0002 1 0add 59
6 2015-06-12 17:36:21 lic0003 1 0add 52
7 2015-06-12 17:36:21 lic0004 1 0add 55
8 2015-06-12 17:36:15 lic0001 1 0bdd 63
9 2015-06-12 17:36:15 lic0002 1 0bdd 52
10 2015-06-12 17:36:15 lic0003 1 0cdd 52
11 2015-06-12 17:36:15 lic0001 1 0cdd 53
12 2015-06-12 17:36:15 lic0002 1 0cdd 52
13 2015-06-12 17:36:15 lic0004 1 0cdd 52
我需要一个设备ID,设备永远不会超过某个值并且具有不同的time_stamp>年。因此,在上表中,我需要说那些从未具有60以上的值且y = 1的设备。这应该在下面返回。由于0add是唯一一个从不低于60的设备,因此可以看到2个不同的时间戳。
r_date deviceid count
2015-06-12 0add 2
我有以下查询来帮助获取计数但是如何添加计数> 1的条件和第一个条件只包括始终低于某个值的值?我表中有200万行。
SELECT device_id, r_date, COUNT(DISTINCT time_stamp) AS numRows
FROM myTable
GROUP BY device_id, r_date;
r_date的类型为DATE,time_stamp的类型为TIME
答案 0 :(得分:0)
你试过这个吗?
SELECT
device_id
, date
, COUNT(DISTINCT timestamp) AS numRows
FROM
myTable
WHERE
(
Select
COUNT(*)
from
myTable tmp
where
tmp.device_id = myTable.device_id
where
value >= 60
) = 0
GROUP BY device_id, date
HAVING numRows > 1
子查询将获得当前device_id超过所选数量的行数(60)&你想要那些数为0的人。
答案 1 :(得分:0)
可以尝试如下,我没有执行此查询只提供逻辑,如果您收到任何错误然后还原错误,以便我可以更正查询 -
SELECT a.r_date, a.deviceid, COUNT(DISTINCT a.timestamp) AS cnt
FROM table1 a
LEFT JOIN table1 b ON a.deviceid=b.deviceid
WHERE b.value<60
GROUP BY a.date, a.deviceid
HAVING cnt>1;
答案 2 :(得分:0)
通过fabio_p向解决方案添加HAVING子句应该可以解决问题:
SELECT deviceid, r_date, COUNT(DISTINCT time_stamp) AS numRows
FROM myTable
WHERE deviceid NOT IN (SELECT deviceid FROM myTable WHERE value > 60)
GROUP BY deviceid, r_date
HAVING COUNT(DISTINCT time_stamp)>y;
答案 3 :(得分:-1)
SELECT deviceid, r_date, COUNT(DISTINCT time_stamp) AS numRows
FROM myTable
WHERE deviceid NOT IN (SELECT deviceid FROM myTable WHERE value > 60)
GROUP BY deviceid, r_date;
应该可以使用,在db的副本上试用它
问候fabio