我在工作中遇到以下问题。我有一个大表,有不同的列和几十万行。我只发布我感兴趣的那些。
假设以下数据集
设备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(*)和一些嵌套选择的混合,但我无法弄明白。感谢
答案 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