Как отфильтровать определенные строки на основе условия в SQL - PullRequest
0 голосов
/ 25 июня 2018

У меня есть эта таблица ввода:

+-------------+--------------+-------+
| ProjectName | ProjectOwner | Col2  |
+-------------+--------------+-------+
| A           | Sara         | Sara  |
| B           | Jack         | Maria |
| B           | Jack         | Jack  |
| C           | Laura        | May   |
| C           | Laura        | Laura |
| D           | Paul         | Jack  |
| E           | May          | May   |
| E           | May          | May   |
+-------------+--------------+-------+

Я хочу проверить каждый проект отдельно, а затем исключить

  1. Если владелец проекта имеет свое имя внутри col2 и другиелюди с ним, а затем удалить строку, которая повторяется Jack Jack,

    а.например, в проекте B имя Джека находится внутри Col2, и он работает с Марией, поэтому удалите Jack Jack

    b.Также удалите Laura Laura в Проекте C

  2. , если владелец Проекта только сам работает внутри проекта, а затем сохраните его, как Проект A и Проект E

  3. если владелец проекта не имеет своего имени внутри col2, исключите проект, например, проект D

  4. Удалите дубликаты, например, проект E

Таблица вывода:

+-------------+--------------+-------+
| ProjectName | ProjectOwner | Col2  |
+-------------+--------------+-------+
| A           | Sara         | Sara  |
| B           | Jack         | Maria |
| C           | Laura        | May   |
| E           | May          | May   | 
+-------------+--------------+-------+

Я пробовал это здесь , но результаты не показали мне Проект A и E

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

Использование EXISTS С ROW_NUMBER() Функция:

select top (1) with ties *
from table t
where exists (select 1 
              from table t1 
              where t1.ProjectName = t.ProjectName and 
                    t1.Col2 = t.ProjectOwner
             )
order by dense_rank() over (partition by ProjectName 
                            order by (case when t.ProjectOwner = Col2 
                                           then 1 else 0 
                                       end)
                           );
0 голосов
/ 25 июня 2018

Вы можете получить желаемые результаты с помощью этого вложенного SQL, используя GROUPING и COUNT аггрегирование:

select ProjectName, ProjectOwner, Col2
  from
(  
   select ProjectName, ProjectOwner, Col2,
          count(1) over ( partition by ProjectName ) cnt
     from mytable
    group by ProjectName, ProjectOwner, Col2
) q
 where ( q.cnt = 1 or ProjectOwner != col2 )
   and ProjectOwner in ( select col2 from mytable );

Демонстрация SQL Fiddle

0 голосов
/ 25 июня 2018

Пожалуйста, попробуйте этот код:

select distinct  *
from mytable m
where (ProjectOwner!=Col2 or not exists(select 1 from mytable m1 where m1.ProjectName=m.ProjectName and  m1.ProjectOwner=m.ProjectOwner and m.Col2!=m1.Col2) )
and ProjectName in (select ProjectName from mytable where ProjectOwner=Col2 )

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...