Использование ROW_NUMBER вместо MAX () - PullRequest
0 голосов
/ 09 марта 2020

Мой вопрос связан с этим один . У меня есть следующий запрос, чтобы получить родной и свободно говорящий языки для сотрудника:

SELECT
        lan.AdminFileId
       ,MAX(lan.MotherTongue) AS MotherTongue
       ,MAX(lan.Fluent) AS Fluent
    FROM (SELECT
            al.AdminFileId
           ,MAX(CASE
                WHEN al.LanguageLevelId = 4 THEN l.Label
            END) AS MotherTongue
           ,MAX(CASE
                WHEN al.LanguageLevelId = 2 THEN l.Label
            END) AS Fluent
        FROM AF_Language al
        LEFT JOIN AF_AdminFile aaf ON aaf.AdminFileId=al.AdminFileId
        INNER JOIN Employee e ON e.AdminFileId=aaf.AdminFileId

        LEFT JOIN Language l ON al.LanguageId = l.ID
        GROUP BY al.AdminFileId
                ,l.Label
                ,al.LanguageLevelId) AS lan
    GROUP BY lan.AdminFileId

Вывод выглядит так:

AdminFileId MotherTongue Fluent
45          English      French
67          Spanish      English
88          Arabic       English

Как я могу использовать ROW_NUMBER, чтобы получить тот же результат? По существу

1 Ответ

2 голосов
/ 09 марта 2020

Я думаю, вам не нужно использовать ROW_NUMBER(), используйте AdminFileId только в предложении GROUP BY будет иметь только одну запись:

SELECT al.AdminFileId,
       MAX(CASE WHEN al.LanguageLevelId = 4 THEN l.Label END) AS MotherTongue,
       MAX(CASE WHEN al.LanguageLevelId = 2 THEN l.Label END) AS Fluent
FROM AF_Language al LEFT JOIN 
     AF_AdminFile aaf 
     ON aaf.AdminFileId = al.AdminFileId LEFT JOIN -- Used LEFT JOIN INSTEAD OF INNER
     Employee e 
     ON e.AdminFileId = aaf.AdminFileId LEFT JOIN 
     Language l 
     ON al.LanguageId = l.ID
GROUP BY al.AdminFileId;

РЕДАКТИРОВАТЬ: Использование row_number:

SELECT al.AdminFileId, l.Label,
       ROW_NUMBER() OVER (PARTITION BY al.AdminFileId 
                          ORDER BY (CASE WHEN al.LanguageLevelId = 4 
                                         THEN 1 ELSE 2
                                    END)
                         ) AS Seq
FROM AF_Language al LEFT JOIN 
     AF_AdminFile aaf 
     ON aaf.AdminFileId = al.AdminFileId LEFT JOIN -- Used LEFT JOIN INSTEAD OF INNER
     Employee e 
     ON e.AdminFileId = aaf.AdminFileId LEFT JOIN 
     Language l 
     ON al.LanguageId = l.ID
WHERE al.LanguageLevelId IN (4, 2);

Тогда вы можете использовать подзапрос:

SELECT AdminFileId,
        MAX(CASE WHEN Seq = 1 THEN Label END) AS MotherTongue,
        MAX(CASE WHEN Seq = 2 THEN Label END) AS Fluent
FROM ( <Query> 
     ) t
GROUP BY AdminFileId;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...