我的查询
SELECT TOP 1 *, COUNT(*) AS totalRun
FROM history
ORDER BY starttime DESC`
估算结果是历史记录表中包含最新starttime
的1行的所有数据和包含记录总数的字段totalrun
,但是......我收到以下错误。< / p>
Msg 8120,Level 16,State 1,Line 1
列'history.id'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。
我做错了什么?
修改
结果的例子:
这些是历史记录表中具有最新启动时间的行的所有字段,其中包含额外的COUNT字段'totalRun'
答案 0 :(得分:5)
聚合只能用两种情况表示。
GROUP BY
声明的地方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
因为这不使用GROUP BY
,您还可以选择*
而不只是选择要分组的字段。
如果您需要不同的内容,请列出一些示例数据和您想要的结果吗?
答案 1 :(得分: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;
答案 2 :(得分:0)
我无法正确理解要求。你为什么使用排名前1的计数(*) 没有group by子句。
如果您想要在上次日期获得的结果TotalRuns,那么您可以使用此查询
SELECT TOP 1 starttime, COUNT(1) AS totalRun
FROM history Group by starttime ORDER BY starttime DESC
答案 3 :(得分:0)
如果这是要求:
估计结果是历史记录表中包含最新开始时间的1行中的所有数据以及包含记录总数的fieldtotalrun,
选择前1 * 从 (选择 * 从历史 其中starttime =(从历史中选择max(starttime)))i 全外连接 (选择count(1)count,max(starttime)sttime as fieldtotalrun 来自历史)j on i.starttime = j.sttime