我正在使用SQL SERVER 2005中引入的ROW_NUMBER()函數來返回一組分頁結果。查詢按預期工作,但我有一個問題。我想要做的是按照降序順序返回計數結果。下面是查詢和下面我會給一點說明:幫助訂購ROW_NUMBER在降序計數?
DECLARE @StartRowIndex INT
DECLARE @MaximumRows INT
SET @StartRowIndex = 1
SET @MaximumRows = 10
;WITH Data AS (SELECT
ROW_NUMBER() OVER (ORDER BY a.column1) as RowNum,
a.column1, a.column2, dbo.f_GetDataCount(a.column3) as cnt
FROM dbo.table1 a
INNER JOIN dbo.table2 b on b.column4 = a.column4
INNER JOIN dbo.table3 c on c.column5 = a.column5
LEFT OUTER JOIN dbo.table4 d on d.column6 = a.column6
WHERE 1=1 AND a.column7 IN (1)
)
SELECT RowNum,column1,
column2,cnt
FROM
Data
WHERE RowNum BETWEEN @StartRowIndex AND (@StartRowIndex + @MaximumRows) - 1
ORDER BY cnt desc
- 我知道的最高數在100,000範圍。
- ORDER By cnt desc does order by the count by descending order,but only for the 10 records itetch。我知道這是因爲RowNum正在由不是計數的aColumn1命令。理想情況下,我想由Count訂購ROWNUM,所以是這樣的:
ROW_NUMBER()OVER(ORDER BY COUNT(*))作爲ROWNUM
以上運行,但它永遠( 17+分鐘)。
作爲一個側面說明,dbo.f_GetDataCount(a.column3)爲CNT返回基於a.column3記錄的總數,所以我嘗試:
ROW_NUMBER()OVER(ORDER BY dbo.f_GetDataCount( a.column3)作爲RowNum,但這也是永恆的,
如果我實際上比這更令人困惑,我會舉一個例子,如果我將StartRowIndex設置爲1,它將返回10條記錄並且第一個記錄將有10,000個。
如果我然後將StartRowIndex設置爲11,它將返回下10條記錄,第一條記錄將有15,000條記錄。
它實際上應該返回的是無論StartRowIndex是什麼,首先都是15000的記錄。
非常感謝幫助。
這裏是該函數的代碼:
CREATE FUNCTION [dbo].[f_GetDataCount]
(
-- Add the parameters for the function here
@column3 nvarchar(10)
)
RETURNS int
AS
BEGIN
-- Declare the return variable here
DECLARE @Result int
-- Add the T-SQL statements to compute the return value here
SELECT @Result = COUNT(a.column3) FROM dbo.table1 a
where a.column3 = @column3
-- Return the result of the function
RETURN @Result
END
你能後,使代碼啓動dbo.f_GetDataCount()函數?您基本上需要實現一個結果集,您可以先按該值進行排序,然後將rownumber分配到該集合上(基本上,您將rownumber作爲rownumber()中的orderby子句進行添加) - 使用內聯標量UDF可以經常癱瘓基於集合的查詢 – chadhoc 2009-11-12 17:36:18
好吧,我添加了該函數的代碼。 – Xaisoft 2009-11-12 17:49:50