2013-11-08 2 views
2

Я пытаюсь выяснить, как фильтровать набор данных из SQL Server.Есть ли лучший способ фильтрации данных, существующих в каждой группе?

DECLARE @OUTPUT AS TABLE (FILTER INT,PART INT,LOT INT) 
INSERT INTO @OUTPUT (FILTER,PART,LOT) VALUES 
(1,1377882157,1379436702), 
(1,1377882157,1382038239), 
(1,1377882157,1382038531), 
(3,1373463498,1380792160), 
(3,1377882157,1379436702), 
(4,1373638746,1382475541), 
(4,1377882157,1379436702), 
(5,1373463498,1380792160), 
(5,1373463959,1380792272), 
(5,1373464034,1380791899), 
(5,1373638746,1379326622), 
(5,1373638746,1382475541), 
(5,1373638756,1383222295), 
(5,1377882157,1379436702), 
(5,1377882157,1382038239), 
(5,1377882157,1382038531), 
(5,1377882159,1383658054), 
(8,1373638746,1379326622), 
(8,1377882157,1379436702) 

Ищу PART & ЛО, которая существует в каждой группе фильтров. Группы фильтров динамически генерируются на основе выбора пользователя.

С предоставленными данными будет возвращен только 1 элемент (например, 1377882157,1379436702), поскольку он является единственным, который существует во всех группах фильтров.

Это то, что у меня есть прямо сейчас ... было интересно, есть ли лучший способ сделать это?

DECLARE @FILTER_CNT INT 
SET @FILTER_CNT = 5 

SELECT 
    F_PART, 
    F_LOT 
FROM @FILTERED_LOTS 
GROUP BY F_PART,F_LOT 
HAVING COUNT(FILTER) = @FILTER_CNT 

Метод, в котором я не должен определять FILTER_CNT, является тем, о чем я думаю.

+0

Почему это плохо? – Szymon

ответ

0

--DECLARE @FILTER_CNT INT --SET @FILTER_CNT = 5

use this instead

SELECT 
    PART, 
    LOT,count(FILTER) as FILTER_total_count 
FROM @OUTPUT 
GROUP BY PART,LOT 
HAVING COUNT(FILTER)=(select count(distinct FILTER) from @OUTPUT) 
+0

Он не даст правильного результата, потому что он не будет проверять, что часть и партия находятся в каждой группе или нет. –

2

Вы можете заменить @FILTER_CNT с подзапроса

SELECT PART, LOT 
    FROM output 
GROUP BY PART, LOT 
HAVING COUNT(FILTER) = 
(
    SELECT COUNT(DISTINCT FILTER) 
    FROM output 
) 

Выход:

 
|  PART |  LOT | 
|------------|------------| 
| 1377882157 | 1379436702 | 

SQLFiddle demo

+0

Это дает худшую производительность, чем исходный запрос. – Szymon

+1

@Szymon Он дает желаемую гибкость – peterm

+0

Глядя на него снова, вы правы. +1 – Szymon

Смежные вопросы