使用ROW_NUMBER而不是MAX()

时间:2020-03-09 14:09:26

标签: sql-server tsql

我的问题与此one有关。我有以下查询来获取员工的母语和流利的语言:

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 个答案:

答案 0 :(得分:2)

我认为您不需要使用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;
相关问题