Member 13772596 Ответов: 1

Делим 2 раза на date_trunc


у меня есть 1 таблица с 2 столбцами,с которыми я работаю (время, статус)
я выбираю определенный день с помощью
date_trunc()
в столбце время и применить условие, где status = '404 NOT FOUND'
и разделите это с ежедневным счетом
чтобы получить процент ежедневных ошибок
статус имеет 2 значения 404 не найдено и 200 ОК
я хочу получить ежедневный процент ошибок

Что я уже пробовал:

select case when status = '404 NOT FOUND' then count(time) END / count(time) from log group by date_trunc('day',time);

я получаю ошибку столбец "log.status" должен появиться в предложении GROUP BY или использоваться в агрегатной функции

Maciej Los

Какой движок базы данных?

Nelek

Он написал SQL в качестве тега для этого вопроса, я полагаю, что это движок.

Maciej Los

Я имею в виду database engine, который связан с Sql Server, Oracle, PostgreSql, MySql и т. д.
Как вы знаете, некоторые движки не обеспечивают некоторых функциональных возможностей. ;)

Nelek

насколько я знаю? до сих пор это не имело почти никакого отношения к базам данных... Я помогал отлаживать некоторые вещи, но никогда не устанавливал их самостоятельно.

Member 13772596

это postgresql

1 Ответов

Рейтинг:
1

Maciej Los

Похоже, вы используете PostgreSQL...

Основная идея состоит в том, чтобы получить общее количество журналов и количество конкретных ошибок:
Весь:

SELECT COUNT(*) AS TotalCount
FROM log;


Количество специфических ошибок
SELECT COUNT(*) AS ErrCount
FROM log
WHERE status = '404 NOT FOUND';


Теперь вам нужно "соединить" оба результата в одно значение:
SELECT ErrCount/Total AS Err404
FROM
(
   (<here_comes_second_query>) as ErrCount,
   (<here_comes_first_query>) as Total
   ) as partial_data;



Видеть: sql - как повторно использовать результирующий столбец в выражении для другого результирующего столбца[^]

[РЕДАКТИРОВАТЬ]
SELECT COUNT(*) / COUNT(CASE WHEN status='404...' THEN 1 END) AS MyResult
FROM log;

Спасибо Корнфельд Элиягу Петер[^] за ваше ценное предложение!


Kornfeld Eliyahu Peter

Другим вариантом может быть использование COUNT(*) и COUNT(expression) в одном и том же запросе и правильным образом,,,

Maciej Los

Вы имеете в виду оконную функцию или что-то в этом роде:

SELECT COUNT(*) / COUNT(CASE WHEN status='404...' THEN 1 END) FROM Log;

Да, вы правы!
Спасибо за ценный комментарий.

Member 13772596

запрос выше не работает, он говорит error in (,) >>> ErrCount,

Maciej Los

Видеть Корнфельд Элиягу Петер- это предложения.

Member 13772596

как раз наоборот !!! любить:
Выберите COUNT(CASE WHEN status='404...' THEN 1 END) / COUNT(*) AS MyResult
из бревен;
и я хочу, чтобы они были сгруппированы по каждому дню

Maciej Los

Подобный этому:

SELECT date_trunc('day',time) As MyDate, COUNT(CASE WHEN status='404...' THEN 1 END) / COUNT(*) AS MyResult
FROM log
GROUP BY date_trunc('day',time);

Member 13772596

нормально ли для него возвращать нули ??? он должен вернуть 1 результат с 2 я думаю

Maciej Los

У меня нет доступа к вашим данным. Откуда мне знать?