如何 ORDER (ROW_NUMBER() OVER PARTITION BY) BY 未选择的列

How to ORDER (ROW_NUMBER() OVER PARTITION BY) BY non-selected column

我有一个查询:

WITH Top_Areas AS
(
SELECT AIP.aid [Author_ID], CAST(P.research_area as VARCHAR(100)) [Research_Area], 
       P.research_area_category_id [Category],
       COUNT(*) [Paper_Count],  
       P.p_year [Paper_Year]
FROM coauthor_individual_papers AIP
JOIN sub_aminer_paper P ON AIP.pid = P.pid
WHERE AIP.aid IN (901706) AND AIP.p_year IN (2005)
GROUP BY
    AIP.aid, CAST(P.research_area as VARCHAR(100)),
    P.research_area_category_id, 
    P.p_year
),
Top_Author_Areas AS
(SELECT *, ROW_NUMBER() OVER(PARTITION BY Author_ID, Paper_Year ORDER BY Paper_Count DESC, Research_Area ASC) AS Rank FROM Top_Areas)

SELECT * 
FROM CTE1
WHERE Rank <= 5  

输出为:

Author_ID   Research_Area   Category    Paper_Count Paper_Year  Rank  
--------------------------------------------------------------------
901706      feature         8           1           2005        1
901706      image annotate  11          1           2005        2
901706      image db        11          1           2005        3
901706      retrieval model 12          1           2005        4  

这个输出只是按Research_Area排序,即ASC,而我还需要按Paper_Count排序,即DESC,而所需的输出 应该是这样的:

Author_ID   Category    Paper_Count Paper_Year  Rank  
----------------------------------------------------
901706      11          2           2005        1
901706      8           1           2005        2
901706      12          1           2005        3  

SELECT列表中不selectResearch_Area是可以的,但是如果不selectResearch_Area,那么如何ORDER BY Research_Area ASC,而我们希望在 Paper_Count 值与上面所需输出中显示的值相同时使用 ORDER BY Research_Area ASC 选项,即
Category 11 位于 Rank 1,因为 Paper_Count
的最大值 Category8和11分别在Rank2和3,原因如下:

我们怎样才能得到想要的输出?

由于您似乎仍然不明白我的观点,即当我们尝试实施 您的 打破平局规则时可能存在不同的 Research_Area 值,我会任意决定 - 我们将使用每个 Category 中最早的 Research_Area 值来打破平局:

WITH Top_Areas AS
(
SELECT AIP.aid [Author_ID],

  MIN(CAST(P.research_area as VARCHAR(100))) [Research_Area],

       P.research_area_category_id [Category],
       COUNT(*) [Paper_Count],  
       P.p_year [Paper_Year]
FROM coauthor_individual_papers AIP
JOIN sub_aminer_paper P ON AIP.pid = P.pid
WHERE AIP.aid IN (901706) AND AIP.p_year IN (2005)
GROUP BY
    AIP.aid,

    --CAST(P.research_area as VARCHAR(100)),

    P.research_area_category_id, 
    P.p_year
),
Top_Author_Areas AS
(SELECT *, ROW_NUMBER() OVER(PARTITION BY Author_ID, Paper_Year
                             ORDER BY Paper_Count DESC, Research_Area ASC) AS Rank
 FROM Top_Areas)

SELECT * 
FROM CTE1
WHERE Rank <= 5

更改的区域在由空行与查询的其余部分分隔开的行上 - 我只是将 MIN 应用到 Research_Area 以获得 single 值用于打破平局,并将其从 GROUP BY 中删除,这两个变化都在 Top_Areas CTE 中。