2009-11-12 60 views
0

我正在使用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 
  1. 我知道的最高數在100,000範圍。
  2. 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 
+0

你能後,使代碼啓動dbo.f_GetDataCount()函數?您基本上需要實現一個結果集,您可以先按該值進行排序,然後將rownumber分配到該集合上(基本上,您將rownumber作爲rownumber()中的orderby子句進行添加) - 使用內聯標量UDF可以經常癱瘓基於集合的查詢 – chadhoc 2009-11-12 17:36:18

+0

好吧,我添加了該函數的代碼。 – Xaisoft 2009-11-12 17:49:50

回答

4

感謝張貼的UDF代碼 - 讓這個嘗試與使用內聯標量UDF。應該比ROWNUBMER(OVER dbo.fn_GetDataCount())的排序快得多。

如果你仍然沒有達到最佳性能,那麼索引可能會發揮作用,或者你可以在中間查看實現column3值的計數(如果它仍然需要解決,我們可以討論選項,只需重新發布) 。

編輯:哎呦,由在條款中添加的「遞減」的順序,因爲你希望他們降 - 也編輯了標量有點...

DECLARE @StartRowIndex INT 
DECLARE @MaximumRows INT 
DECLARE @EndRowIndex INT 

SELECT @StartRowIndex = 1, @MaximumRows = 10 
SELECT @EndRowIndex = (@StartRowIndex + @MaximumRows) - 1 


;WITH Data1 as (
    SELECT a.column3 as c3, count(*) as frequency 
    from dbo.table1 a 
    group by a.column3 
), 
Data AS (SELECT 
     ROW_NUMBER() OVER (ORDER BY coalesce(d.frequency,0) desc) as RowNum, 
     a.column1, a.column2, d.frequency 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 
     LEFT OUTER JOIN Data1 d 
     on a.column3 = d.c3 
     WHERE 1=1 AND a.column7 IN (1) 
) 
SELECT RowNum,column1, 
    column2,cnt 
FROM 
Data 
WHERE RowNum BETWEEN @StartRowIndex AND @EndRowIndex 
ORDER BY cnt desc 
+0

我會嘗試,讓你知道。非常感謝。 – Xaisoft 2009-11-12 18:01:42

+0

請確保您在上面的子句中使用「DESC」得到更新的編輯... – chadhoc 2009-11-12 18:07:09

+0

我沒有刷新頁面,所以我在爲什麼顯示1的計數而撓頭。在添加desc關鍵字後,它就會出現。它需要6秒鐘才能將10條記錄拉回來,所以它可能也是索引問題。我還有另一個問題,我在這裏提出的查詢實際上比實際查詢小10倍,這是一個動態SQL查詢。我收到有關轉換爲nvarchar的錯誤。如果你願意看一下,我可以更新我的帖子。非常感謝 – Xaisoft 2009-11-12 18:21:06