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标准的一部分,不管怎样,不幸的是,我不能使用这个软件使用关键字。