2015-07-03 86 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;