SQL:1999中的高效计数和分组

SQL:1999中的高效计数和分组,sql,Sql,我试图计算在特定时间内针对特定对象记录的记录数。我需要根据每个对象记录的记录数返回主键键和友好名称全名。所有这些都在同一个表中事件 这对于键或全名来说很容易做到: SELECT FullName, COUNT(*) AS "RecordNum" FROM TableA WHERE RecordTime BETWEEN TIMESTAMP Start AND TIMESTAMP Finish GROUP BY FullName 如果我想使用 SELECT FullName, Key, COUNT

我试图计算在特定时间内针对特定对象记录的记录数。我需要根据每个对象记录的记录数返回主键
和友好名称
全名
。所有这些都在同一个表中
事件

这对于
全名
来说很容易做到:

SELECT FullName, COUNT(*) AS "RecordNum"
FROM TableA
WHERE RecordTime BETWEEN TIMESTAMP Start AND TIMESTAMP Finish
GROUP BY FullName
如果我想使用

SELECT FullName, Key, COUNT(*) AS "RecordNum"
FROM TableA
WHERE RecordTime BETWEEN TIMESTAMP Start AND TIMESTAMP Finish
GROUP BY FullName
我得到了错误

Select元素键无效,因为summary函数或GROUP BY子句中未包含列引用

我可以将顶部的表创建为
TableB
,然后将其连接到
TableA

SELECT TableA.FullName, TableA.Key, TableB."RecordNum"
FROM TableA INNER JOIN
    (SELECT Key, COUNT(*) AS "RecordNum"
    FROM TableA
    WHERE RecordTime BETWEEN TIMESTAMP Start AND TIMESTAMP Finish
    GROUP BY FullName) As TableB On TableA.Key = TableB.Key
ORDER BY TableB.RecordNum DESC

不过,这似乎是一种相当冗长的查询方式,因为它都包含在同一个表中。我是否可以使用
GROUP BY
子句并返回
全名
列,而无需诉诸
内部联接

只需使用窗口函数即可:

SELECT a.*, COUNT(*) OVER (PARTITION BY a.FullName) AS "RecordNum"
FROMT TableA a
WHERE a.RecordTime BETWEEN TIMESTAMP a.Start AND TIMESTAMP a.Finish
ORDER BY "RecordNum";

用您正在使用的数据库标记您的问题。\n它是软件包的一部分,该软件包的数据库基于SQL:1999又名SQL 3。这是SQL唯一可以做的事情:1999@a_horse_with_no_name谢谢我只需要确保在选择时间段时小心,以保持负载可控。@GordonLinoff我找不到合适的标签。我可能只是瞎了眼,但在SQL:1999或SQL 3中我看不到它。不幸的是,我无法访问微软自1999年以来添加的任何功能。@Flash_Steel:添加窗口功能的不是微软,而是ANSI SQL标准委员会(Oracle实际上早在1999年就有了它们)@a_horse_,没有名字啊,好吧。我只听说过Transact-SQL。然而,我仍然不认为它是SQL:1999标准的一部分,不管怎样,不幸的是,我不能使用这个软件使用关键字。