2

我正在寻找从查询中得到两件事,给定一组约束:

  • 第一场比赛
  • 比赛总数

我可以通过以下方式获得第一场比赛:

SELECT TOP 1
    ID,
    ReportYear,
    Name,
    SignDate,
     ... 
FROM Table
WHERE
     ...
ORDER BY ... //I can put in here which one I want to take

然后我可以得到匹配计数,如果我使用

SELECT
    MIN(ID),
    MIN(ReportYear),
    MIN(Name),
    MIN(SignDate),
     ... ,
    COUNT(*) as MatchCount
FROM Table
WHERE
     ...
GROUP BY
     ??? // I don't really want any grouping

我真的很想避免对所有结果进行分组和使用聚合函数。这个问题SQL Server Select COUNT without using aggregate function or group by建议答案是

SELECT TOP 1
    ID,
    ReportYear,
    Name,
    SignDate,
     ... ,
    @@ROWCOUNT as MatchCount
FROM Table

这在没有 TOP 1 的情况下有效,但是当它在那里时,@@ROWCOUNT = 返回的行数,即 1。我怎样才能在没有任何分组的情况下获得 COUNT(*) 的输出(where 子句之后剩下的任何内容)或需要聚合所有列?

我不想做的是重复这些操作两次,第一行一次,@@ROWCOUNT 再一次。我没有找到可以正确使用 GROUP BY 的方法,因为我严格想要符合我的标准的项目数量,并且我想要列如果我对它们进行 GROUP 会丢弃这个数字 - 除非我误解了 GROUP BY。

4

3 回答 3

7

假设您使用的是新版本的 SQL Server(内存中的 2008+),那么您可以使用分析函数。

稍微简化一下,它们是一种对一组数据而不是一组数据进行聚合的方式——基本聚合的扩展。

而不是这个:

SELECT
     ... , 
    COUNT(*) as MatchCount
FROM Table
WHERE
     ...

你来做这件事:

SELECT
     ... ,
    COUNT(*) as MatchCount OVER (PARTITION BY <group fields> ORDER BY <order fields> )
FROM Table
WHERE
     ...
GROUP BY

如果没有实际运行一些代码,我无法准确回忆起您不能以这种方式使用哪些聚合。计数还是可以的。

于 2012-05-04T07:25:58.410 回答
7

好吧,你可以使用 OVER 子句,它是一个窗口函数。

SELECT  TOP (1)
    OrderID, CustID, EmpID,
    COUNT(*) OVER() AS MatchCount
FROM    Sales.Orders
WHERE   OrderID % 2 = 1
ORDER BY OrderID DESC 
于 2012-05-04T07:27:06.107 回答
2

尝试下一个查询:

select top 1
    *, count(*) over () rowsCount
from
    (
        select
            *, dense_rank() over (order by ValueForOrder) n
        from
            myTable
    ) t
where
    n = 1
于 2012-05-04T07:32:37.947 回答