我在工作中有以下问题。我有一个大的表与不同的列和几个10万行。我只发我感兴趣的。
假设以下数据集
设备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,但只有前2从每个设备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或COunt(*)和一些嵌套的选择的混合,但我不能弄清楚。由于
这可能不是一个非常有效的方式来做到这一点,但我不认为有一个更好的解决方案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,则拒绝该行。
不确定这是否会与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