2016-09-13 4 views
1

У меня есть следующая проблема на работе. У меня большой стол с разными столбцами и несколькими 100 000 строк. Я только вывешиваем те им заинтересованы.Как ограничить результаты SQLite для определенной группы результатов?

Предположим следующие набор данных

ID устройства, Feature 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 

мне нужно выбрать строки с функцией Status = 1, но только первые 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

Почему тег 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 Вы уверены? Я просто запустил его снова с вашими примерными данными, и он возвращает только функции 3 и 4 (не 5) для идентификатора устройства 1. – 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 
Смежные вопросы