2014-11-14 2 views
0

У меня есть таблица в базе данных Oracle, которая хранит запросы к веб-приложению. Структура что-то вроде: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;