我正在进行分组吗?

时间:2012-04-11 08:24:49

标签: sql

我有一个记录错误的系统。从我的错误中选择:

SELECT message, personid, count(*)
FROM errorlog
WHERE time BETWEEN TO_DATE(foo) AND TO_DATE(foo) AND substr(message,0,3) = 'ERR'
GROUP BY personid, message
ORDER BY 3

我想要的是看看是否有任何用户“产生”更多错误而不是其他用户。例如ERROR FOO,如果用户A有4个错误而用户B有4000个,那么逻辑就会让我觉得用户B做错了。

但我可以按照自己的方式进行分组吗?这是一个修改后的版本,其中选择仅对分组的消息进行分组并对其进行计数,从而使ERROR FOO从我的示例中得到4004。

1 个答案:

答案 0 :(得分:1)

根据您的查询,如果邮件不同,那么您将获得每人多条记录。

如果您只需要每人一条记录,则需要在message附近设置aggregate function

例如你可以这样做:

SELECT MIN(message), personid, count(*)
FROM errorlog
WHERE time BETWEEN TO_DATE(foo) AND TO_DATE(foo) AND substr(message,0,3) = 'ERR'
GROUP BY personid, message
ORDER BY 3

我已将message更改为MIN(message),这将按字母顺序返回此人的第一个message


但是,如果您乐意为每个人返回多条记录,那么我认为您的脚本没有任何问题。它会显示personidmessage的列表,这些列表由表格中最多的列表排序,仅显示messageERR开头的记录