2

一連の制約が与えられた場合、クエリから 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 句の後に残っているもの) の出力をグループ化またはすべての列を集計する必要がありますか?

私がやりたくないのは、これらのそれぞれを 2 回繰り返すことです。最初の行に対して 1 回、次に @@ROWCOUNT に対してもう一度行います。GROUP BY を正しく使用する方法が見つかりません。条件に一致するアイテムの数が厳密に必要であり、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 に答える