2016-02-25 2 views
0

У меня есть большая таблица журналов в базе данных, в которой мне нужно извлечь некоторую информацию.Построить SQL-запрос

Выход я работаю в направлении является:

день - Попытки - Неудачные попытки

Моя таблица выглядит так;

LogID - Timestamp - Sender - Receiver - SecondsConEst - InOut - ErrorMsg - MsgID 

Чтобы извлечь эту ошибку, что нужно подсчитать MsgID, где SecondsConEst является> = 1 и InOut = Выход и где MsgID было повторено 8 или более раз.

В настоящее время у меня есть:

SELECT date(timestamp) as Day, count(MsgID) as attempts 
FROM database.log 
where Receiver like 'AAB%' and out = 'Out' and (SecondsConEst >= '1' and ErrorMsg != '') 
group by MsgID having count(messageid) >= 8 ; 

Теперь это дает мне

Day   Attempts 
2016-02-15 9 
2016-02-15 8 

Но я хотел бы объединить это. Если попытка равна 8 или более, ее можно называть «неудачной» и ее следует считать неудачной, показывая, что в этот день общее число не прошло.

Я попытался с помощью

count(case when count(MsgID >= 8) then 1 else NULL end) 

в моем выборе, но это дает мне «Invalid использование групповой функции».

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

SELECT (distinct MsgID) inner join where... 

Любые указатели были бы замечательными.

+1

Можете ли вы добавить данные таблицы образцов и ожидаемый результат? (Кроме того, вы используете MySQL и MS SQL Server здесь?) – jarlh

+2

MySQL не совпадает с SQL Server, какой из них вы используете? Или вы пытаетесь придумать что-то, что работает на обоих? –

+0

Ваш синтаксис предлагает MySQL, поэтому я удалил тег SQL Server. –

ответ

1

Я думаю, что вам нужен другой уровень агрегации:

SELECT day, SUM(attempts >= 8) as Failures, COUNT(*) as Total 
FROM (SELECT date(MIN(timestamp)) as Day, count(MsgID) as attempts 
     FROM database.log 
     WHERE Receiver like 'AAB%' and out = 'Out' and 
      (SecondsConEst >= '1' and ErrorMsg <> '') 
     GROUP BY MsgID 
    ) 
GROUP BY day; 

Заметьте, что эта версия явно выбирает минимальную временную метку для каждого идентификатора сообщения. Это обрабатывает случай, когда сообщения разделяются между несколькими днями.

+0

Спасибо, работал как шарм! – HenrikM

1

Так что-то вроде этого:

SELECT Day,count(case when attempts > 8 then 1 end) as cntFailed FROM(
    SELECT date(timestamp) as Day, count(MsgID) as attempts 
    FROM database.log 
    where Receiver like 'AAB%' and out = 'Out' and (SecondsConEst >= '1' and ErrorMsg != '') 
    group by MsgID having count(messageid) >= 8); 
GROUP BY Day 

Если я правильно вас понял, все, что вам не хватало еще один выбор, чтобы обернуть ваш выбор.

Смежные вопросы