1

私のクエリ

SELECT TOP 1 *, COUNT(*) AS totalRun 
FROM history 
ORDER BY starttime DESC`

推定結果は、最新の履歴テーブルの 1 行とレコードの合計量をstarttime含むフィールドのすべてのデータtotalrunですが...次のエラーが表示されます。

メッセージ 8120、レベル 16、状態 1、行 1
列 'history.id' は、集計関数にも GROUP BY 句にも含まれていないため、選択リストでは無効です。

私は何を間違っていますか?

結果の編集
例: 期待される結果 これらは、追加の COUNT フィールド 'totalRun' を含む、履歴テーブルの最新の開始時刻を持つ行のすべてのフィールドです。

4

4 に答える 4

5

集計は 2 つのケースでしか表現できません。

  1. GROUP BY発言があるところ
  2. OVER句を使用する場所

以下は、最新の開始時刻と、その開始時刻を共有するソース テーブル内の行数を示します...

SELECT
  starttime,
  COUNT(*)  AS row_count
FROM
  history
GROUP BY
  starttime
ORDER BY
  starttime DESC

この構造で選択できるフィールドは、ステートメント内のフィールド(GROUP BYおよび複数のフィールドを使用できます)、または集計 * ( SUM()COUNT()など) のみです。

ただし、グループ化された行だけでなく、テーブル全体に対して実行する場合は、ステートメントで句をCOUNT(*)使用できます。OVERSELECT

SELECT
  *,
  COUNT(*) OVER (PARTITION BY 1) AS row_count
FROM
  history
ORDER BY
  starttime DESC

これは を使用しないため、グループ化するフィールドだけでなくGROUP BY選択することもできます。*

別のものが必要な場合は、いくつかのサンプル データと希望する結果を含めていただけますか?

于 2013-05-27T11:34:01.283 に答える
3

列ごとに集計またはグループ化します。どちらでもない列があります

SELECT TOP 1
   starttime, COUNT(*) AS totalRun
FROM history
GROUP BY starttime, foo
ORDER BY starttime DESC;

列が必要な場合はfoo、次のように追加します

SELECT TOP 1
   starttime, foo, COUNT(*) AS totalRun
FROM history
GROUP BY starttime, foo
ORDER BY starttime DESC, foo;
于 2013-05-27T10:57:57.433 に答える
0

要件を正しく理解できませんでした。count(*) を使用し、group by 句を使用せずにトップ 1 を使用する理由。

最終日に獲得した TotalRuns の結果が必要な場合は、このクエリを使用できます

SELECT TOP 1  starttime, COUNT(1) AS totalRun 
            FROM history Group by starttime ORDER BY starttime DESC
于 2013-05-27T11:02:45.053 に答える