2012-10-13 25 views
0

我有一張表,我想檢查行的排名,如果排名大於100,我將設置權限。
我寫流程代碼來查找記錄的排名,但是當我使用rank或row_number函數而沒有附加字段(如用戶名或家庭)時,它不起作用,儘管它可以與其他字段之一一起使用。查找行的排名

SELECT * from 
(Select username, 
Rank() over(order by point desc) as 'ranking' 
from student) t 
where (username='test') 

我想找到一條記錄,並設置一個變量與此記錄的等級。

+1

您可以向該問題添加一些示例數據嗎? – Gidil

+1

爲什麼在那裏標記'MySQL'? – hjpotter92

回答

0

可能是此查詢?

Select count(*)+1 as rank from student 
where point > (select point from student where username = 'test') 

至極應該返回的用戶數量比所選用戶

+0

我不認爲這與所問的問題有很大關係。 – Gidil

+0

這個查詢給出了排名......感謝-1 ...你的建議在哪裏? –

+0

歡迎您。該查詢不排名學生,它只是計算用戶名稱「測試」(+1)的點數較少的學生人數。絕對不是海報要求的。 – Gidil

1

少點,我不知道,如果你的sqlser版本supprts CTE。如果它是一個> = 2005 SQLSERVER this is your query

create table #student (username varchar(10), point int); 

insert into #student values 
('a', 10), 
('b', 20), 
('test', 15); 

declare @var int; 

with cte as (
    select username, 
    Rank() over(order by point desc) as [ranking] 
    from #student 
) 
select @var = [ranking] from cte where username = 'test'; 
print str(@var); 

結果:

2 
0

對於RANK工作,你需要指定了要排名在PARTITION BY列,然後,ORDER BY是比如如果出現像Rank列具有相同值並且存在衝突的情況,那麼按列排序將通過排序衝突記錄來排序問題。

+1

只是不正確。 [MSDN文檔](http://msdn.microsoft.com/en-us/library/ms176102.aspx)清楚地表明您不指定ORDER BY之前的列。這就是ORDER BY的用途! – Gidil

+0

@Gidil:該文檔說'partition_by_clause將FROM子句產生的結果集劃分爲應用該函數的分區。如果未指定,則該函數將查詢結果集的所有行視爲單個組。 ' – dotNETbeginner

+0

這與您發佈的內容無關(因爲PARTITION BY是可選的)。 此外,這是顯而易見的痛苦,你沒有太多的經驗,在這方面。 PARTITION BY元素允許在同一結果集內有幾個等級,根據分區進行分隔。 – Gidil