帮助订购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
- 我知道的最高数在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
感谢张贴的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
我会尝试,让你知道。非常感谢。 – Xaisoft 2009-11-12 18:01:42
请确保您在上面的子句中使用“DESC”得到更新的编辑... – chadhoc 2009-11-12 18:07:09
我没有刷新页面,所以我在为什么显示1的计数而挠头。在添加desc关键字后,它就会出现。它需要6秒钟才能将10条记录拉回来,所以它可能也是索引问题。我还有另一个问题,我在这里提出的查询实际上比实际查询小10倍,这是一个动态SQL查询。我收到有关转换为nvarchar的错误。如果你愿意看一下,我可以更新我的帖子。非常感谢 – Xaisoft 2009-11-12 18:21:06
你能后,使代码启动dbo.f_GetDataCount()函数?您基本上需要实现一个结果集,您可以先按该值进行排序,然后将rownumber分配到该集合上(基本上,您将rownumber作为rownumber()中的orderby子句进行添加) - 使用内联标量UDF可以经常瘫痪基于集合的查询 – chadhoc 2009-11-12 17:36:18
好吧,我添加了该函数的代码。 – Xaisoft 2009-11-12 17:49:50