帮助订购ROW_NUMBER在降序计数?

问题描述:

我正在使用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

感谢张贴的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