【问题标题】:Get number of records scanned in aggregate query获取聚合查询中扫描的记录数
【发布时间】:2011-02-24 08:03:30
【问题描述】:

我的应用程序使用一般形式执行许多查询:

SELECT <aggregate-functions>
FROM <table-name>
WHERE <where-clause>
GROUP BY <group-by column list>

我想知道有多少记录对聚合结果集有贡献(换句话说,有多少记录与 WHERE 子句中的条件匹配),由于 SELECT 子句中的聚合函数和GROUP-BY 子句。我知道我可以使用相同的 WHERE 子句执行一个简单的 SELECT COUNT(*) 来获取该数字,但如果可能的话,我想避免第二次查询。是否有 SQL Server 特性/功能/等无需其他查询即可生成该值?

【问题讨论】:

    标签: sql-server aggregate record-count


    【解决方案1】:

    一个简单的解决方案是子选择:

    Select ...
        , ( Select Count(*) 
            From Table 
            Where ...) As TotalCount
    From Table
    Where ...
    Group By ...
    

    如果您使用的是 SQL Server 2005 或更高版本,您可以执行以下操作:

    With RankedItems As
        (
        Select Col1
            , Row_Number() Over ( Order By Col1 Asc, Col2 Asc... ) As Num
            , Row_Number() Over ( Order By Col1 Desc, Col2 Desc ) As RevNum
        From Table
        Where ...
        )
    Select Col1, Min(Num + RevNum - 1) As TotalCount
    From RankedItems
    Group By Col1
    

    【讨论】:

    • 太好了,这正是我想要的。不知道为什么我没想到。
    • 有没有办法在没有子选择的情况下做到这一点?我很确定是的。 PhpMyAdmin 如何计算行数?
    • @Čamo - 有很多方法可以得到这个答案。在 2008 年之后的 SQL Server 版本中,您可以将 Over() 子句与 Count 结合使用。所以你可以做类似Count(*) Over()Count(*) Over ( Partition By ...)
    【解决方案2】:

    您可以添加一些涉及聚合的任意值的计数,甚至可以添加

    SELECT  x.name, 
            y.name, 
            z.name, 
            AVG(x.tacos) AS average_tacos, 
            SUM(1) AS aggregated_row_count
    FROM ....
    WHERE ...
    GROUP BY x.name, y.name, z.name
    

    【讨论】:

    • 这似乎也很好用。我只需要将结果集中的 aggregated_row_count 列相加即可得到总行数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 2014-05-21
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 2013-12-19
    相关资源
    最近更新 更多