1

我在工作中有以下问题。我有一个包含不同列和几 100 000 行的大表。我只会发我感兴趣的。

假设以下数据集

设备 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(*) 以及一些嵌套选择,但我无法弄清楚。谢谢

4

2 回答 2

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,则拒绝该行。

于 2016-09-13T19:16:15.120 回答
-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 
于 2016-09-13T19:33:37.927 回答