Ограничить результат от внутреннего запроса соединения до 2 строк - PullRequest
0 голосов
/ 20 июня 2019

Мой запрос дает мне результат из сгруппированных данных, но теперь я хочу только две строки

Я пробовал HAVING COUNT(*) <= 2, но проблема недопустима в списке выбора, поскольку она не содержится ни в статистической функцииили предложение GROUP BY.

мой запрос

select f.CompanyName, f.EmployeeCity, f.PrioritySL ,f.EmployeeSeniorityLevel ,f.EmployeeID
from (
   select ConcatKey, min(PrioritySL) as PSL 
   from dbo.WalkerItContacts group by ConcatKey 
) as x inner join dbo.WalkerItContacts as f on f.ConcatKey = x.ConcatKey and f.PrioritySL = x.PSL
where f.PrioritySL != '10'

Компания Apple имеет 9 записей. Мне нужны только 2 записи

мои данные

company name priority a 10 a 1 a 3 b 2 b 4 b 3 b 5 c 1 c 10 c 2

мои ожидаемые данные

company name priority a 1 a 3 b 2 b 3 c 1 c 2

Ответы [ 3 ]

0 голосов
/ 20 июня 2019

Вы можете сформулировать это более кратко и с лучшей производительностью как:

select top (2) wic.*
from (select wic,
             rank() over (partition by CompanyName, ConcatKey order by PrioritySL) as seqnum
      from dbo.WalkerItContacts wic
     ) wic
where seqnum = 1 and
      wic.PrioritySL <> 10 and
      wic.CompanyName = 'Apple';
0 голосов
/ 20 июня 2019

Я думаю, что вы могли бы решить вашу проблему, используя функцию ROW_NUMBER (), чтобы подсчитать строки и отфильтровать их в предложении WHERE, чтобы показать только 2 строки в группе.

Я думаю, что-то подобное может работать для вас:

SELECT rownum, f.CompanyName, f.EmployeeCity, f.PrioritySL, 
                                               f.EmployeeSeniorityLevel, f.EmployeeID
FROM ( SELECT ConcatKey, MIN(PrioritySL) AS PSL, ROW_NUMBER() OVER(PARTITION BY 
                                                             f.CompanyName) AS rownum
       FROM dbo.WalkerItContacts
       GROUP BY ConcatKey) AS x
                    INNER JOIN dbo.WalkerItContacts AS f ON f.ConcatKey = x.ConcatKey 
                                                             AND f.PrioritySL = x.PSL
WHERE f.PrioritySL != '10' AND rownum <= 2
ORDER BY f.CompanyName ASC;

Надеюсь, это поможет некоторым.

0 голосов
/ 20 июня 2019

Добавьте предложение top 2 к внешнему запросу:

select top 2 f.CompanyName, f.EmployeeCity, f.PrioritySL ,f.EmployeeSeniorityLevel ,f.EmployeeID
    from (
       select ConcatKey, min(PrioritySL) as PSL 
       from dbo.WalkerItContacts group by ConcatKey 
    ) as x inner join dbo.WalkerItContacts as f on f.ConcatKey = x.ConcatKey and f.PrioritySL = x.PSL
    where f.PrioritySL != '10' 
and f.CompanyName= 'Apple'

даст вам две строки.Добавьте предложение порядка во внешнем запросе, чтобы вы могли контролировать, какие две строки возвращаются.

...