Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 帮助按降序排列行数和计数?_Sql Server_Tsql - Fatal编程技术网

Sql server 帮助按降序排列行数和计数?

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

我使用SQLServer2005中引入的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
  • 我知道最高计数在100000+范围内
  • ORDER By cnt desc按结果的计数按降序排列,但 仅适用于它获取的10条记录。我知道这是因为RowNum是由a.Column1排序的,而a.Column1不是计数。理想情况下,我希望按计数订购RowNum,因此类似于以下内容:
  • (按计数(*)排序)上的行数()为RowNum

    上面的代码可以运行,但需要花费很长时间(17分钟以上)

    作为补充说明,dbo.f_GetDataCount(a.column3)As cnt返回基于a.column3的记录总数,因此我尝试:

    ROW_NUMBER()按dbo.f_GetDataCount(a.column3)的顺序作为RowNum覆盖(ORDER),但这也花了很长时间

    如果我真的把它弄糊涂了,我会举一个小例子。如果我把StartRowIndex设置为1,它将返回10条记录,第一条记录将有10000条

    如果我将StartRowIndex设置为11,它将返回接下来的10条记录,第一条记录将有15000条

    不管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值的计数(如果仍然需要解决,我们可以在这里讨论选项,只需重新发布)

    编辑:哎呀,在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