2012-06-06 2 views
1

У меня есть таблица с данными, связанными с аварийными инцидентами. Я хочу сравнить, сколько инцидентов перекрывается (по времени). Я знаю, что база данных по сути неупорядочен, но у меня есть время начала (и окончания) инцидента, поэтому я могу упорядочить записи по времени.Сравнить данные в таблице

Я думаю, что конечным результатом будет набор результатов, в котором была бы каждая запись и дополнительное поле, которое указывало бы, что оно перекрывает любые инциденты (0 для none, 1 для одного перекрытия, 2 для двух перекрытий ...). Исторически существует конечное число перекрытий (6 - текущий максимум), но можно было бы иметь больше.

В настоящее время я делаю этот тип анализа в Excel со вспомогательным столбцом, который сравнивает текущую запись с предыдущими записями, чтобы определить, есть ли перекрытие (или сколько), и оно работает нормально, но похоже, что я должен быть в состоянии выполнить это строго в SQL.

EDIT: Вот пример из Excel, но данные хранятся в одной таблице SQL. У меня есть admin priveleges для базы данных, поэтому я могу реализовать практически любое решение, за исключением изменения структуры базы данных (ее системы COTS). Я включил формулу для столбца перекрытия. Кроме того, я остановил формулу выборки с двумя перекрытиями, но я буду учитывать больше, когда буду применять ответ.

Incident Start    End   Overlap Overlap Formula 
    1 2012-01-01 07:00 2012-01-01 08:00   
    2 2012-01-02 07:00 2012-01-02 08:00 0 =IF(C2>B3,1,0) 
    3 2012-01-02 07:30 2012-01-02 08:30 1 =IF(C3>B4,IF(C2>B4,2,1),0) 
    4 2012-01-03 07:00 2012-01-03 08:00 0 =IF(C4>B5,IF(C3>B5,2,1),0) 
    5 2012-01-04 07:00 2012-01-04 08:00 0 =IF(C5>B6,IF(C4>B6,2,1),0) 
    6 2012-01-04 07:30 2012-01-04 08:30 1 =IF(C6>B7,IF(C5>B7,2,1),0) 
    7 2012-01-04 07:45 2012-01-04 08:45 2 =IF(C7>B8,IF(C6>B8,2,1),0) 
    8 2012-01-04 08:45 2012-01-04 09:45 0 =IF(C8>B9,IF(C7>B9,2,1),0) 
    9 2012-01-05 07:00 2012-01-05 08:00 0 =IF(C9>B10,IF(C8>B10,2,1),0) 
+0

Можете ли вы показать несколько строк данных образца и желаемых результатов? Затем мы можем построить полезный ответ вместо угадывания в схеме/данных и дать вам запросы с именами таблиц и столбцов, такими как foo и bar. Кроме того, публикация вашей функции Excel может быть полезной, чтобы точно увидеть, что вы делаете. –

+0

Я сейчас ухожу от своего стола, но добавлю некоторые данные, когда вернусь. Thx – dav

ответ

1

Если я понял ваш questiion, и предполагая простую таблицу для ваших инцидентов с колоннами IdStartDate, и EndDate вы могли бы найти количество наложений для каждого случая с использованием подзапроса с APPLY, что-то вроде:

SELECT I.Id, O.Overlaps 
FROM Incidents I 
CROSS APPLY (
    SELECT COUNT(*) AS Overlaps 
    FROM Incidents C 
    WHERE C.Id <> I.Id 
    AND (C.StartDate BETWEEN I.StartDate AND I.EndDate OR 
      C.EndDate BETWEEN I.StartDate AND I.EndDate) 
) O 
+0

Это сработало большое спасибо! Мне нужно подойти ближе к подзапросу с помощью функции «Применить» - я не уверен, что полностью понимаю, как это работает, но это дало мне правильный ответ. – dav

+1

Нет проблем! APPLY довольно удобно; он дает вам способ выполнить функцию, зависящую от таблицы, для каждой строки вашего основного запроса. Таким образом, запрос, который вычисляет количество совпадений, применяется к каждой строке в таблице инцидентов. Это похоже на более гибкий/мощный JOIN – Bort

1

Мой английский очень плохо, так что я не совсем понимаю вашу проблему

, если это то, что я думаю, вы можете использовать группу, в SQL http://www.w3schools.com/sql/sql_groupby.asp

select incident, count(*) 
from your table 
group by incident 

также, если у вас есть даты, вы можете указать этот запрос в диапазоне дат:

select incident, count(*) 
from your table 
where startDate >= @startDate and endDate <= @finishDate 
group by incident 

только если вы хотите сделать это между двумя датами

извините за плохой английский, и извините, если это не то, что вы хотите!

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