SQL:获取具有多个条件的行

时间:2015-07-03 08:34:20

标签: mysql

我有下表:

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

4 个答案:

答案 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