PostgreSQL - Как получить данные, сгруппированные по двум столбцам? - PullRequest
0 голосов
/ 28 декабря 2018

Я хочу посчитать количество IP-адресов для определенного IP-адреса и диапазон дат, например where date = 2017-12-01 and IP = '122.12.168.105'.

Я ожидаю получить 3 столбца: дату, количество IP-адресов для даты и сам IP-адрес:

|    the_date  |count|       IP        |
|   2017-12-01 | 155 | 122.12.168.105  |

На данный момент у меня есть следующий запрос:

SELECT COUNT(ip), ip 
FROM my_db.logs
GROUP BY ip 
LIMIT 100; 

Но он возвращает мне только счет за каждый IP.Как мне также сгруппировать по дате?

Когда я пытаюсь добавить дату в оператор SELECT, возникает ошибка, указывающая, что the_date должно быть в предложении GROUP_BY.Но как мне тогда группировать IP-адреса?

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Добавьте the_date в оператор группировки:

SELECT the_date, COUNT(1), ip 
FROM my_db.logs
GROUP BY the_date, ip
LIMIT 100;

Если имя столбца date (не the_date), вы должны использовать двойные кавычки, потому что date является зарезервированнымслово :

SELECT "date", COUNT(1), ip 
FROM my_db.logs
GROUP BY "date", ip
LIMIT 100;
0 голосов
/ 28 декабря 2018

Вам необходимо добавить date к group by:

SELECT the_date, ip, COUNT(ip)
FROM my_db.logs
GROUP BY the_date, ip
LIMIT 100; 

Обычно, при использовании LIMIT вы получите ORDER BY.Например, чтобы получить наиболее распространенные комбинации ip / date:

SELECT the_date, ip, COUNT(*)
FROM my_db.logs
GROUP BY the_date, ip
ORDER BY COUNT(*) DESC
LIMIT 100; 
0 голосов
/ 28 декабря 2018

Я хочу подсчитать количество IP-адресов для определенного IP-адреса и диапазон дат, например, где date = 2017-12-01 и IP = '122.12.168.105'.

Просто добавьте фильтр в качестве предложения WHERE.

SELECT COUNT(ip) as cnt, ip 
FROM my_db.logs
WHERE
    my_date = to_date('2017-12-01', 'yyyy-mm-dd') 
    AND ip = '122.12.168.105'
GROUP BY ip 
LIMIT 100; 

Это вернет одну строку с количеством раз, когда данный IP появляется в журналах за данную дату.Например:

CNT | IP
15  | 122.12.168.105

Как группировать по дате?

Если вы хотите вернуть больше (не агрегированных) столбцов, вам нужно добавить их впредложение GROUP BY при добавлении их в SELECT:

SELECT COUNT(ip) as cnt, ip, my_date
FROM my_db.logs
WHERE
    my_date = to_date('2017-12-01', 'yyyy-mm-dd') 
    AND ip = '122.12.168.105'
GROUP BY ip, my_date
LIMIT 100; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...