2015-07-03 67 views
1

获取行我有以下表:SQL:与多个条件

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> y的计数。所以在上面的表格中,我需要说那些从未具有超过60和y = 1的值的设备。这应该返回下面。由于0add是唯一一款永远不会低于60的设备,并且可以在2个不同的时间戳中看到。

r_date  deviceid count 
2015-06-12 0add   2 

我有下面的查询,以帮助计取,但我怎么加计数> 1,并且第一条件的条件,只包括值始终低于一定值?我在桌上有两百万行。

SELECT device_id, r_date, COUNT(DISTINCT time_stamp) AS numRows 
FROM myTable 
GROUP BY device_id, r_date; 

r_date的类型为DATE和TIME类型

+0

我想你会需要各种各样的子查询在这里先消除从未具有低于60的值的设备然后将其余的组合在一起。 –

+0

你能提供一个相关数据集的小转储,或者是一个假结构,但是结构如何? –

+0

@VictorNitu结构和我在这里完全一样。让我知道如果你需要更多 – fheo

回答

0

你有没有试过这种的TIME_STAMP的?

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计数

+0

我不认为这会奏效。它只是消除了<60的值,但仍然留下其他值。我认为OP只需要永远不会低于60的设备。 –

+0

我误解了第一个条件,希望我的编辑是正确的 - 我认为答案太简单了。 – PaulF

+0

@PaulF不要认为这会有所帮助。我希望计数大于1的那些以及永远不会超过60的那些。 – fheo

-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; 

应该工作,试图在一个副本你的数据库的

问候法比奥

+0

同样的问题,因为我的答案的最后编辑 - 也需要返回只有那些numRows> 1 – PaulF

+0

添加一个HAVING COUNT(DISTINCT time_stamp)> Y; –

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; 
+0

是'table1 b ON a.licenceid = b.licenceid'是否正确或应该是'table1 b ON a.deviceid = b.deviceid'? – fheo

+0

谢谢@fheo它应该是deviceid –

0

添加HAVING子句由fabio_p解决方案应该做的伎俩:

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;