Sql server 帮助按降序排列行数和计数?
我使用SQLServer2005中引入的ROW_NUMBER()函数返回一组分页结果。查询按预期工作,但我有一个问题。我想做的是返回按计数降序排列的结果。以下是查询,下面我将给出一点说明:Sql server 帮助按降序排列行数和计数?,sql-server,tsql,Sql Server,Tsql,我使用SQLServer2005中引入的ROW_NUMBER()函数返回一组分页结果。查询按预期工作,但我有一个问题。我想做的是返回按计数降序排列的结果。以下是查询,下面我将给出一点说明: DECLARE @StartRowIndex INT DECLARE @MaximumRows INT SET @StartRowIndex = 1 SET @MaximumRows = 10 ;WITH Data AS (SELECT ROW_NUMBER() OVER (ORDER B
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
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值的计数(如果仍然需要解决,我们可以在这里讨论选项,只需重新发布) 编辑:哎呀,在over子句中的order by中添加了“desc”,因为您希望它们降序-另外,稍微编辑了一下标量
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
感谢您发布UDF代码-尝试一下,而不是使用内联标量UDF。应该比通过ROWNUBMER(OVER dbo.fn_GetDataCount())进行排序快得多 如果您仍然有次优的性能,那么索引可能会发挥作用,或者您可以考虑在中间实现column3值的计数(如果仍然需要解决,我们可以在这里讨论选项,只需重新发布) 编辑:哎呀,在over子句中的order by中添加了“desc”,因为您希望它们降序-另外,稍微编辑了一下标量
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
您可以发布组成dbo.f_GetDataCount()函数的代码吗?您基本上需要具体化一个结果集,您可以先按该值排序,然后在该集上分配rownumber(基本上与将其作为rownumber()中的orderby子句添加所做的相同)-使用内联标量UDF通常会破坏基于集合的queryOk,我为该函数添加了代码。您可以发布组成dbo.f_GetDataCount()函数的代码吗?您基本上需要具体化一个结果集,您可以先按该值排序,然后在该集合上分配行数(基本上与在rownumber()中将其添加为orderby子句所做的操作相同)-使用内联标量UDF通常会破坏基于集合的queryOk,我为该函数添加了代码。我现在将尝试并让您知道。感谢您。我没有刷新页面,所以我一直在琢磨为什么它显示计数为1。添加desc关键字后,它似乎可以工作。要用6秒钟才能拉回10条记录,事实就是这样可能还有索引问题。我还有另一个问题,我在这里提出的查询实际上比我的实际查询小10倍,这是一个动态sql查询。我在转换为nvarchar时遇到了一个错误。如果你愿意看的话,我可以更新我的帖子。非常感谢,尽管可能会让我更满意e sense尝试缩小范围,并根据与此特定问题的接近程度发布不同的问题,以最合理的为准存储过程查询在我进行更改后,实际需要1分30秒才能返回10行。动态查询几乎有275行,我可以通过电子邮件将其发送给您吗(对我来说更快)并解释几个问题。这些问题对你们来说可能是不需要动脑筋的。你们也可能会发现一些可以加快速度的问题。若电子邮件对你们不起作用,我可以随时发布另一个问题,但这需要一段时间。当然,不要在这里发布联系信息,只需转到我的个人资料页(在任何帖子中单击我的用户名)并在此处列出的网站(我的博客)上填写一封联系电子邮件…我现在会尝试并让您知道。谢谢。我没有刷新页面,所以我一直在琢磨为什么它显示计数为1。添加desc关键字后,它似乎可以工作。需要6秒钟才能拉回10条记录,因此可能还有索引问题。我还有另一个问题,我在这里提出的查询是actually比我的实际查询小10倍,这是一个动态sql查询。我在转换为nvarchar时遇到了一个错误。如果你愿意看一下,我可以更新我的帖子。非常感谢,尽管尝试缩小一点范围并根据离得有多近发布不同的问题可能更有意义对于这个特定的查询,无论哪一个看起来最有意义,在我进行更改后,存储的proc查询实际上需要1分30秒才能返回10行。动态查询几乎有275行长,我可以用电子邮件发送给您吗(对我来说更快)并解释几个问题。它们可能对你们来说是不需要动脑筋的。你们也可能发现一些可以加快速度的东西。若电子邮件对你们不起作用,我可以随时发布另一个问题,但这需要一段时间。当然,而不是po