2013-05-09 73 views
3

我有一個表可以說排名信息具有我需要找到最選民在每年的Oracle SQL查詢

username mvid votedate 
john  1 23-sep-90 
john  2 23-sep-90 
smith  1 23-sep-90 
john  3 24-oct-91 
smith  3 24-oct-91 
smith  4 25-dec-91 
smith  5 25-dec-91 

我需要寫的SQLDeveloper一個SQL查詢(甲骨文),它會給我的成員誰在每年得到最多的選票。輸出應該是用戶名,年份,每年的總票數。 讓我們考慮一下上面的例子: 我需要這樣的輸出。

username year number_Of_Votes 
john  1990 2 
smith  1991 3 

因爲在1990年約翰擊敗史密斯1投票,而在1991年史密斯擊敗約翰2票。

我達到了統計所有選票的程度,但我無法獲得一年中的最大票數。

這是我做了什麼:

select r1.username, 
    Extract(year from r1.votedate)"Year", 
    count(username) 
from rankinginfo r1 
where Extract(year from r1.votedate) is not null 
group by Extract(year from r1.votedate), 
     r1.username; 
order by Extract(year from r1.votedate), 
     username; 
+0

如果由於某種原因想要刪除自己的帖子,請點擊帖子下方的「刪除」按鈕,而不是刪除帖子的內容。謝謝。 – 2013-05-19 06:15:51

+0

我回滾了你的編輯。如果您想刪除該問題,請這樣做。刪除內容不是StackOverflow的工作方式。如果你需要更多的信息,你應該查看[faq]和[about]頁面,或者選擇[meta]。 – 2013-05-19 06:20:05

回答

-1

你可以試試下面的一個:

SELECT MAX(point) as HIGHEST 

FROM 
(SELECT pointA as point FROM tableA 

UNION 
SELECT pointB as point FROM tableB) t 
5
select * 
from (
     select VotesPerUserPerYear.* 
     ,  dense_rank() over (
        partition by voteyear 
        order by votecount desc) as rn 
     from (
       select username 
       ,  extract(year from votedate) as voteyear 
       ,  count(*) as votecount 
       from YourTable 
       group by 
         username 
       ,  extract(year from votedate) 
       ) VotesPerUserPerYear 
     ) SubQueryWithRank 
where rn = 1 -- Only top voter per year 

Example at SQL Fiddle.

+0

在這種情況下,您可以使用'dense_rank()'而不是'row_number()'。我已經更新了答案並向SQL小提琴添加了一個示例 – Andomar 2013-05-14 12:57:27

2

一種方法是

select username, year, cnt from (
select username, cnt, row_number() over (partition by year order by cnt desc) rn 
from (
select username, to_char(votedate, 'YYYY') year, count(*) cnt 
from rankinginfo 
group by to_char(votedate, 'YYYY') 
) 
) where rn = 1