SQL Server聚合函数查询错误

Ger*_*mer 1 sql sql-server aggregate-functions

我的查询

SELECT TOP 1 *, COUNT(*) AS totalRun 
FROM history 
ORDER BY starttime DESC`
Run Code Online (Sandbox Code Playgroud)

估计结果是历史表中1行的所有数据,其中包含最新记录,以及包含记录总数starttime的字段totalrun,但是......我得到以下错误.

消息8120,级别16,状态1,行1
列"history.id"在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中.

我究竟做错了什么?

EDIT
结果示例: 预期结果 这些是行的所有字段,在历史记录表中具有最新的开始时间,并带有额外的COUNT字段'totalRun'

Mat*_*lie 5

聚合只能用两种情况表示.

  1. 你有GROUP BY声明的地方
  2. 你使用该OVER条款的地方

以下内容将为您提供最近的开始时间和源表中共享该开始时间的行数...

SELECT
  starttime,
  COUNT(*)  AS row_count
FROM
  history
GROUP BY
  starttime
ORDER BY
  starttime DESC
Run Code Online (Sandbox Code Playgroud)

在这种结构中唯一可以选择的字段都在的那些GROUP BY语句(你可以有几个),或聚集*(如SUM(),COUNT()等).

但是,如果您希望在COUNT(*)整个表上完成,而不仅仅是组合在一起的行,则可以在OVER语句中使用该子句SELECT.

SELECT
  *,
  COUNT(*) OVER (PARTITION BY 1) AS row_count
FROM
  history
ORDER BY
  starttime DESC
Run Code Online (Sandbox Code Playgroud)

因为这不使用a GROUP BY,所以您也可以选择*而不仅仅是您正在分组的字段.

如果您需要不同的东西,请包含一些示例数据和您想要的结果吗?