2012-04-11 73 views
0

我有一个记录错误的系统。从我的errortable选择:我是否正确地分组?

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做错了。

但我可以按我的方式分组吗?这是一个修改后的版本,其中的选择只对消息进行分组并计算,解决这个错误FOO导致我的示例4004结束。

回答

1

随着您的查询,如果消息不同,那么你将得到每个人多个记录。

如果你只是想每人一个记录,你就需要把aggregate function各地message

例如,你可以这样做:

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 

在这里,我已经改变了messageMIN(message)将返回这个人的第一个message,按字母顺序。


但是,如果您很乐意为每个人返回多个记录,那么我认为您的脚本没有问题。它会显示通过在表中最大的群体有序的personidmessage列表,只显示其中有一个message开始ERR

+0

那有什么?我得到每人多个记录的记录。在这个选择中,我想要错误,我也记录警告,所以如果一个人有多个不同的警告,它是okey和好,如果他们导致多个记录。感谢您的验证,我的SQL正在进行中:D – Jason94 2012-04-11 08:33:52

+0

@ Jason94在这种情况下,我认为您的查询很好。我已经更新了我的答案。 – Curt 2012-04-11 08:36:48