2016-09-13 63 views
1

我在工作中遇到以下問題。我有一張大桌子,有不同的列和幾十萬行。我只張貼的那些即時通訊感興趣的如何限制每個特定組結果的SQLite結果?

假設以下數據集

設備ID,功能ID,功能狀態

1,  1,  0 
1,  2,  0 
1,  3,  1 
1,  4,  1 
1,  5,  1 

2,  1,  1 
2,  2,  0 
2,  3,  0 
2,  4,  1 
2,  5,  0 

3,  1,  1 
3,  2,  1 
3,  3,  1 
3,  4,  1 
3,  5,  1 

4,  1,  0 
4,  2,  0 
4,  3,  1 
4,  4,  0 
4,  5,  0 

,我需要選擇與功能狀態行= 1,但只有每個設備ID的前兩位。

查詢的結果應該是:

1,3,1 
1,4,1 
2,1,1 
2,4,1 
3,1,1 
3,2,1 
4,3,1 

我想是這樣的:

SELECT brdsurfid,featureidx,FeatStatus FROM Features F1 WHERE FeatStatus = 1 AND 
    (SELECT COUNT(*) FROM Features F2 
    WHERE F2.FeatureIdx <= F1.FeatureIdx AND F2.FeatStatus = 1) < 2 
    ORDER BY BrdSurfId,FeatureIdx; 

我在另一響應找到,但它沒有相當的工作。

我知道我需要使用LIMIT或者COUNSE(*)和一些嵌套選擇的混合,但我無法弄清楚它。由於

+0

爲什麼MySQL的標籤? –

+0

因爲我想知道SQL和使用MySql的人可以提供幫助。爲什麼不?這是一個數據庫相關的問題,即使它是Sqlite的具體情況,交叉經驗可能會工作 –

回答

1

這可能並不是一個非常有效的方式做到這一點,但我不認爲這是SQLite的一個更好的解決方案(即涉及到一個單一的查詢):

SELECT * 
FROM t t0 
WHERE FeatureStatus AND 
     (SELECT count(*) 
     FROM t t1 
     WHERE t0.DeviceID=t1.DeviceID 
     AND FeatureStatus 
     AND t1.FeatureId<t0.FeatureId 
    )<2; 

我假設表稱爲t。我們的想法是查找狀態爲1的所有功能,然後爲每個功能對同一產品的狀態進行統計。如果該數超過2,則拒絕該行。

+0

讓我試試吧!這正是我想要自己做的。 –

+0

它不起作用。它返回FeatStatus = 1的所有行。:( –

+0

@AlexandruLucianSusma確定嗎?我只是再次使用示例數據運行它,它只返回設備ID爲1的功能3和4(不是5)。 – redneb

-1

不知道這是否會與sqlite的,但什麼它的價值工作...

;with result as 
(
     SELECT 
     brdsurfid, 
     featureidx, 
     FeatStatus , 
     ROW_NUMBER() OVER(PARTITION BY brdsurfid ORDER BY fieldWhatever) AS 'someName1', 
     ROW_NUMBER() OVER(PARTITION BY featureidx ORDER BY fieldWhatever) AS 'someName2', 
     ROW_NUMBER() OVER(PARTITION BY FeatStatus ORDER BY fieldWhatever) AS 'someName3' 

     FROM 
      Features 
) 
    SELECT * 
    FROM 
    result 
    WHERE 
    FeatStatus = 1 AND 
    someName1 <= 2 AND 
    someName2 <= 2 AND 
    someName3 <= 2