2014-11-14 53 views
0

我在Oracle数据库中有一个表,用于存储对Web应用程序的请求。结构是这样的:SQL GROUP BY 3列不工作

--------------------------------------- 
DATETIME | USERID  | ACTION 
--------------------------------------- 

我想建立一个查询,聚合这些请求的日期,用户和操作在过去30天。我至今是:

SELECT 
    DATETIME, 
    USERID, 
    ACTION, 
    COUNT(*) 
FROM 
    USER_ACTIVITY 
WHERE 
    DATETIME > SYSDATE - 30 
GROUP BY 
    DATETIME, 
    USERID, 
    ACTION 
ORDER BY 
    DATETIME DESC, 
    COUNT(*) DESC 

当我运行此我得到了很多重复的行,如:

-------------------------------------------------- 
DATETIME | USERID  | ACTION  | COUNT 
-------------------------------------------------- 
14-NOV-14  user1  update  2 
14-NOV-14  user1  update  1 
14-NOV-14  user2  update  3 
14-NOV-14  user1  update  1 

有谁知道为什么这些都没有得到卷起成一个单一的数对于每个不同的组合?

回答

3

大概你在日期上有一个时间组件。试试这个:

SELECT trunc(DATETIME) as date, USERID, ACTION, COUNT(*) 
FROM USER_ACTIVITY 
WHERE DATETIME > SYSDATE - 30 
GROUP BY trunc(DATETIME), USERID, ACTION 
ORDER BY DATETIME DESC, COUNT(*) DESC; 

你可能想同样的想法适用于where条款,除非你想要的部分天:

SELECT trunc(DATETIME) as date, USERID, ACTION, COUNT(*) 
FROM USER_ACTIVITY 
WHERE DATETIME > trunc(SYSDATE) - 30 
GROUP BY trunc(DATETIME), USERID, ACTION 
ORDER BY DATETIME DESC, COUNT(*) DESC;