2016-09-13 88 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