如何 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
、
的最大值
Category
8和11分别在Rank
2和3,原因如下:
Paper_Count
值相同。
- 所以必须按
Research_Area ASC
订购 Rank
2 和 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 中。
我有一个查询:
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
、
的最大值
Category
8和11分别在Rank
2和3,原因如下:
Paper_Count
值相同。- 所以必须按
Research_Area ASC
订购
Rank
2 和 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 中。