Как ограничить результаты только теми строками, которые мне нужны? - PullRequest
0 голосов
/ 13 июня 2018

Это код, который у меня есть в настоящее время, который тянет 2 верхних контакта, но поскольку каждая компания имеет более 2 контактов, когда я ввожу на экран USERID (это необходимо), он дает мне строки со всеми идентификаторами пользователей для компании, хотя онине мои лучшие 2 контакта.

select companyid, 
 userid,
(case when seqnum = 1 then username end) as  Contact1,
(case when seqnum = 2 then username end) as  Contact2,


from (
select *, row_number() over (partition by companyid order by username) as 
seqnum from 
( SELECT b.userid, username, a.companyid from [UsersInCompanies] a
JOIN [Companies] c on a.companyid = c.companyid 
join [aspnet_Users] b on a.userid = b.userid ) t ) l

Набор результатов Я получаю

CompanyID Userid  Contact1  Contact2 
1         xyz-78  Jane Doe1  NULL    
1         uik-90  NULL       JD2    
1         jkl-70  NULL       NULL
1         abc-60  NULL       NULL

Желаемый результат

CompanyID Userid  Contact1  Contact2 
1         xyz-78  JaneDoe1  NULL    
1         uik-90  NULL       JaneDoe2    

Должен ли я использовать какие-либо функции COUNT & TOP?

Ответы [ 2 ]

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

Я думаю, что это чище

with cte as 
(
    SELECT b.userid, username, a.companyid, 
           ROW_NUMBER() OVER (PARTITION BY a.companyid order by b.username) as rn 
    FROM [UsersInCompanies] a 
    JOIN [Companies] c 
      ON a.companyid = c.companyid 
    JOIN [aspnet_Users] b 
      ON a.userid = b.userid
)
select ct1.*, cte2.username 
  from cte as cte1 
  join cte as cte2 
    on cte1.companyid = cte2.companyid
   and cte1.rn = 1
   and cte2.rn = 2
0 голосов
/ 13 июня 2018

Вам нужна фильтрация (т.е. seqnum <= 2), но я бы переписал ее как:

with t as (
        SELECT b.userid, username, a.companyid, 
               ROW_NUMBER() OVER (PARTITION BY a.companyid order by b.username) as seqnum 
        FROM [UsersInCompanies] a INNER JOIN 
             [Companies] c 
             ON a.companyid = c.companyid INNER JOIN 
             [aspnet_Users] b 
             ON a.userid = b.userid
 )
select companyid, userid,
       (case when seqnum = 1 then username end) as  Contact1,
       (case when seqnum = 2 then username end) as  Contact2
from t
where seqnum <= 2;
...