2016-12-13 6 views
0

У этого может быть очевидное решение, но я не могу вспомнить, как это назвать в данный момент.Фильтрация списка по выбору

Допустим, у вас есть таблица вроде этого:

Member | ID  | Type 
------ | ------ | ------ 
100 | 1  | A 
100 | 2  | B 
101 | 3  | A 
102 | 4  | A 
103 | 5  | B 
104 | 6  | B 
104 | 7  | A 
104 | 8  | A 

Если член имеет А я хочу, чтобы вернуть все строки с А для этого члена.
Если у члена нет A, тогда я хочу вернуть все строки с B для этого члена.

Я понимаю, что могу написать решение, используя НЕ СУЩЕСТВУЮЩИЕ, но мне было интересно, есть ли более общее решение (в случае нескольких категорий). В основном я хочу отфильтровать, существует ли категория в предпочтительном порядке.

В этом примере результат будет возвращать:

Member | ID  | Type 
------ | ------ | ------ 
100 | 1  | A 
101 | 3  | A 
102 | 4  | A 
103 | 5  | B 
104 | 7  | A 
104 | 8  | A 

Спасибо.

ответ

2
Declare @YourTable table (Member int,ID int,[Type] varchar(25)) 
Insert Into @YourTable values 
(100 , 1 , 'A'), 
(100 , 2 , 'B'), 
(101 , 3 , 'A'), 
(102 , 4 , 'A'), 
(103 , 5 , 'B'), 
(104 , 6 , 'B'), 
(104 , 7 , 'A'), 
(104 , 8 , 'A') 

Select Member,ID,Type 
From (
     Select * 
       ,RN = Dense_Rank() over (Partition By Member Order by Type) 
      From @YourTable 
    ) A 
Where RN=1 

Возвращает

Member ID Type 
100  1 A 
101  3 A 
102  4 A 
103  5 B 
104  7 A 
104  8 A 
+0

Это, кажется, сделать трюк. Раньше я не слышал о dense_rank(). Спасибо! – JJ32

+0

@ JJ32 Функции окна - наши друзья. Хорошо стоит время, чтобы им комфортно. Приветствия. –

0

Вы можете попробовать это:

 ;WITH tb(Member,ID ,Type)AS 
    (
     SELECT 100,1,'A' UNION 
     SELECT 100,2,'B' UNION 
     SELECT 101,3,'A' UNION 
     SELECT 102,4,'A' UNION 
     SELECT 103,5,'B' UNION 
     SELECT 104,6,'B' UNION 
     SELECT 104,7,'A' UNION 
     SELECT 104,8,'A' 
    ) 
    SELECT * FROM (
     SELECT *,MAX(CASE WHEN type='A' THEN 1 ELSE 0 END)OVER(PARTITION BY tb.Member) HasA FROM tb 
    ) AS t WHERE (t.HasA=1 AND t.Type='A') OR t.HasA=0 
 
Member  ID   Type HasA 
----------- ----------- ---- ----------- 
100   1   A 1 
101   3   A 1 
102   4   A 1 
103   5   B 0 
104   7   A 1 
104   8   A 1 
+0

Да, это работает. Но я не вижу, как это применимо к случаям, когда есть, скажем, дюжина категорий. Как я могу сделать это в более общее решение? – JJ32

+0

Не могли бы вы дать более подробную информацию о своем требовании? –

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