Как получить примат функции для сотрудника? - PullRequest
3 голосов
/ 11 февраля 2020

У меня есть следующий запрос, чтобы получить все функции и соответствующие области (компании) для сотрудника:

SELECT * FROM employee_scope WHERE EmployeeId=54

Вывод:

  EmployeeId  FunctionId   CompanyId    SortOrder
    54          273          8            1
    54          273          19           2
    54          273          32           3
    54          273          151          4
    54          897          49           5
    54          897          77           6
    54          897          54           7
    54          333          56           8         
    54          333          90           9        
    54          123          78           10         

Логика c behing sortOrder - это / минимальное значение, которое получает основная функция, когда у Сотрудника есть одна основная функция для одной компании. В этом случае EmployeeId = 54 имеет одинаковый основной functionId = 273 для разных компаний (областей) с CompanyId = 8,19,32,151

Я хочу получить примат каждой функции, как показано ниже:

    EmployeeId  FunctionId   CompanyId    SortOrder  Primacy
    54          273          8            1          Primary
    54          273          19           2          Primary
    54          273          32           3          Primary
    54          273          151          4          Primary
    54          897          49           5          Secondary
    54          897          77           6          Secondary
    54          897          54           7          Secondary
    54          333          56           8          Third
    54          333          90           9          Third
    54          123          78           10         Fourth

1 Ответ

3 голосов
/ 11 февраля 2020

Вы можете использовать оконные функции для вычисления обоих SortOrder и Primacy столбцов, например:

select 
    EmployeeId,
    FunctionId,
    CompanyId,
    row_number() over(order by minCompanyId, CompanyId) SortOrder,
    case dense_rank() over(order by minCompanyId)
        when 1 then 'Primacy'
        when 2 then 'Secondary'
        when 3 then 'Third'
        when 4 then 'Fourth'
    end Primacy
from (
    select
        t.*,
        min(CompanyId) over(partition by EmployeeId, FunctionId) minCompanyId
    from mytable t
) t

Внутренний запрос вычисляет наименьший идентификатор компании для идентификатора функции. Затем внешний запрос использует эту информацию для генерации порядкового номера и ранжирования групп. Обратите внимание, что порядок сортировки вычисляется запросом - вам не нужно (или не нужно) хранить эту производную информацию: если вставлена ​​новая запись, вам может потребоваться переназначить новые значения для всего столбца.

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

EmployeeId | FunctionId | CompanyId | SortOrder | Primacy  
---------: | ---------: | --------: | :-------- | :--------
        54 |        273 |         8 | 1         | Primacy  
        54 |        273 |        19 | 2         | Primacy  
        54 |        273 |        32 | 3         | Primacy  
        54 |        273 |       151 | 4         | Primacy  
        54 |        897 |        49 | 5         | Secondary
        54 |        897 |        54 | 6         | Secondary
        54 |        897 |        77 | 7         | Secondary
        54 |        333 |        56 | 8         | Third    
        54 |        333 |        90 | 9         | Third    
        54 |        123 |        78 | 10        | Fourth   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...