Имена Concat для row_number () или аналогичной функции - PullRequest
0 голосов
/ 26 февраля 2020

мои данные повторяют строки для индивидуальных отношений между людьми. Например, ниже указано, что Джон Смит известен 3 сотрудникам:

Person          EmployeeWhoKnowsPerson
John Smith      Derek Jones
John Smith      Adrian Daniels
John Smith      Peter Low

Я собираюсь сделать следующее:

1) Подсчитать количество людей, которые знают Джона Смита. Я сделал это с помощью функции row_number (), и она, кажется, ведет себя так:

select Person, MAX(rowrank) as rowrank
from (
            select Person, EmployeeWhoKnowsPerson, rowrank=ROW_NUMBER() over (partition by Person order by EmployeeWhoKnowsPerson desc)
            from Data
) as t
group by Person

, которая возвращает:

Person          rowrank
John Smith      3

Но теперь я смотрю на объединение столбца EmployeeWhoKnowsPerson для возврата и задавался вопросом, как это могло быть возможно:

Person          rowrank     EmployeesWhoKnow
John Smith      3           Derek Jones, Adrian Daniels, Peter Low

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Для SQL Сервер 2017 +

select
    person,
    count(*) as KnowsCount,
    string_agg(EmployeeWhoKnowsPerson, ',') WITHIN GROUP (ORDER BY EmployeeWhoKnowsPerson ASC) AS EmployeesWhoKnowPerson
from 
  data
group by person;

Для предыдущих версий:

select
    person,
    count(*) as KnowsCount,
    stuff((select ',' + EmployeeWhoKnowsPerson
           from data as dd
           where dd.Person = d.Person
           order by EmployeeWhoKnowsPerson
     for xml path('')), 1, 1, '') AS EmployeesWhoKnowPerson
from 
  data as d
group by person;

И вы слишком много думаете о том, кто знает кусок.

Вот SQL Демонстрация Fiddle с добавленным дополнительным именем.

0 голосов
/ 26 февраля 2020

Если 2017+, вы можете использовать string_agg() в простой группе:

Пример

Declare @YourTable Table ([Person] varchar(50),[EmployeeWhoKnowsPerson] varchar(50))  Insert Into @YourTable Values 
 ('John Smith','Derek Jones')
,('John Smith','Adrian Daniels')
,('John Smith','Peter Low')

Select Person 
      ,rowrank = sum(1)
      ,[EmployeeWhoKnowsPerson] = string_agg([EmployeeWhoKnowsPerson],', ')
 From @YourTable
 Group By Person

Возвращает

Person      rowrank  EmployeeWhoKnowsPerson
John Smith  3        Derek Jones, Adrian Daniels, Peter Low

Если <2017 ... использовать подход stuff () / xml </strong>

Select Person 
      ,rowrank = sum(1)
      ,[EmployeeWhoKnowsPerson] = stuff((Select ', ' + [EmployeeWhoKnowsPerson] 
                                          From  @YourTable
                                          Where Person=A.Person
                                          For XML Path ('')),1,2,'')
 From @YourTable A
 Group By Person
...