如何限制每个特定结果组的SQLite结果?

时间:2016-09-13 19:03:20

标签: mysql sql sqlite select limit-per-group

我在工作中遇到以下问题。我有一个大表,有不同的列和几十万行。我只发布我感兴趣的那些。

假设以下数据集

设备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中的前2行。

查询结果应为:

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或COunt(*)和一些嵌套选择的混合,但我无法弄明白。感谢

2 个答案:

答案 0 :(得分: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,则拒绝该行。

答案 1 :(得分:-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 
相关问题