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

聚合只能在两种情况下表示。

  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(*)整个表上完成,而不仅仅是组合在一起的行,您可以OVER在语句中使用子句SELECT

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

因为这不使用 a 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

如果这是要求:

估计的结果是历史表中 1 行的所有数据,其中包含最新的开始时间和一个包含记录总数的字段totalrun,

select top 1 * from (Select * from history where starttime= (select max(starttime) from history) )i full external join (select count(1) count , max(starttime) sttime as fieldtotalrun from history ) j on i.starttime =j.sttime

于 2013-05-27T11:35:21.020 回答
0

我无法正确理解要求。为什么您使用 top 1 和 count(*) 而没有 group by 子句。

如果您想要最后一天获得的 TotalRuns 结果,那么您可以使用此查询

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