Есть ли лучший способ фильтрации данных, который существует в каждой группе?
Я пытаюсь выяснить, как отфильтровать набор данных из 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 & LOT, которая существует в каждой группе фильтров. Группы фильтров генерируются динамически на основе выбора пользователя.
С предоставленными данными вернет только 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 - это то, о чем я думаю.
2 ответа
Вы можете заменить @FILTER_CNT
с подзапросом
SELECT PART, LOT
FROM output
GROUP BY PART, LOT
HAVING COUNT(FILTER) =
(
SELECT COUNT(DISTINCT FILTER)
FROM output
)
Выход:
| ЧАСТЬ | ЛОТ | |------------|------------| | 1377882157 | 1379436702 |
Вот демоверсия SQLFiddle
--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)