Способ найти отличительные значения из таблицы по определенному столбцу - PullRequest
0 голосов
/ 03 июня 2018

Вот таблица, состоящая из данных, как показано ниже:

StandardName|Username    |RType
------------|------------|--------
Department  |Department  |  Position
Division    |Division    |  Entity
Division    |Division    |  Position
Plant       |Plant       |  Entity
Section     |Section     |  Position
SubDivision |Sub-Division|  Entity
SubDivision |Subdivision |  Position
SubSection  |Subsection  |  Position
Unit        |Unit        |  Entity

Я хочу, чтобы все StandardName и UserName следовали за Rtype = 'Entity', а в случае Rtype = 'Position' он получит толькоStandardName, которые не связаны с RType 'Entity'

. Для этого я выполнил запрос, подобный этому

SELECT DISTINCT u.StandardName, u.UserName ,ISNULL(e.RType,'position') AS RType
from (
     SELECT  DISTINCT StandardName,UserName
     from Table1 AS ee where   RType = 'Entity'  
     UNION
     SELECT  DISTINCT StandardName, UserName
     from Table1 AS pp where  RType = 'position' 
) u
LEFT OUTER JOIN (
     select UserName,StandardName,RType 
     from Table1 WHERE RType='Entity' 
) e on e.StandardName = u.StandardName
 ORDER BY Rtype

Затем получим

StandardName|Username    |RType
------------|------------|--------
Division    |Division    |  Entity
Plant       |Plant       |  Entity      
SubDivision |Sub-Division|  Entity
SubDivision |Subdivision |  Entity       
Unit        |Unit        |  Entity
Department  |Department  |  Position
Section     |Section     |  Position
SubSection  |Subsection  |  Position

Здесь, в случае«SubDivision» он появляется два раза, тогда как он должен появляться один раз с RType «Entity».

Ожидаемый результат должен быть--

StandardName|Username    |RType
------------|------------|--------
Division    |Division    |  Entity
Plant       |Plant       |  Entity      
SubDivision |Sub-Division|  Entity            
Unit        |Unit        |  Entity
Department  |Department  |  Position
Section     |Section     |  Position
SubSection  |Subsection  |  Position

SQLFIDDLE Ссылка

Ответы [ 4 ]

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

Это запрос расстановки приоритетов.Метод Патрика - хороший метод, особенно когда есть только два типа.

Другой метод использует row_number():

select e.StandardName, e.Username, e.RType
from (select e.*,
             row_number() over (partition by StandardName
                                order by (case RType when 'Entity' then 1 when 'Position' then 2 else 3 end)
                               ) as seqnum
      from employees e
     ) e
where seqnum = 1;
0 голосов
/ 03 июня 2018

Для каждого StandardName вы хотите строку с «Entity», но если этого не существует, строка с «Position».Это простая задача для ROW_NUMBER:

with cte as 
 ( 
   select
      StandardName
     ,Username
     ,RType
     ,row_number() 
      over (partition by StandardName  -- for each StandardName
            order by RType) as rn      -- sort to get Entity first
   from Table1
 )
select
   StandardName
  ,Username
  ,RType
from cte
where rn = 1
order by
   RType
  ,Username
;

См. fiddle

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

Попробуйте это:

select * from Employees 
where rtype = 'Entity' 
or
standardname in (
select standardname from Employees 
where rtype = 'Position' and 
standardname not in 
(select standardname from employees where rtype = 'Entity'))
order by rtype,standardname
0 голосов
/ 03 июня 2018

Это заявление SQL, переведенное из ваших требований:

 -- gimme all things that are entity
 select StandardName, UserName, RType 
   from Table1
   where RType = 'Entity'  
 union   
 -- and all things that have no entity-entry
   select StandardName, UserName, RType from Table1 as k
   where rtype = 'Position' and not exists (
       select 1 
       from table1 as t 
       where t.standardname = k.standardname 
         and t.rtype = 'Entity'  
   )

не содержит ваших "distincs", но вы получите результат:

StandardName    UserName        RType
----------------------------------------
Division        Division        Entity
Plant           Plant           Entity
SubDivision     Sub-Division    Entity
Unit            Unit            Entity
Department      Department      Position
Section         Section         Position
SubSection      Subsection      Position

Вы делаетене иметь дубликатов 'Entity' -входов - поэтому не требуется отдельного

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