Нахождение среднего времени (в секундах) для нескольких строк в SQL

#sql #datetime

#sql #datetime

Вопрос:

В настоящее время я пытаюсь найти среднее значение между двумя разными датами для нескольких строк. Таким образом, для каждой созданной даты вычтите назначенную дату. Затем найдите среднее значение по всему datediff (ищем результат в секундах)

 declare @offset int; 
declare @st_date date;
declare @en_date date;

set @offset = (@BrowserTimezoneOffSet);
set @st_date = (@st_datein);
set @en_date = (@en_datein);

select 
 avg(subtract) as [AVG Assigned Time]
 from
    (select
        DATEDIFF(ss, ign.createdDate, ign.assignDate) as subtract
        from
        (select
            DATEADD(mi,@offset,s.CreatedDateTime) as createdDate
            ,DATEADD(mi,@offset,w.AuditHistoryDateTime) as assignDate
        from ServiceReq s, Audit_ServiceReq w
        WHERE   
        w.OwnerTeam_IsChanged = N'True' --owner was actually changed at some point
        AND s.Subject = N'General Request'
        AND w.AuditHistoryUser != N'InternalServices' --Doesn't include those done automagically by system
        AND w.AuditHistoryEventType != 1 --Doesn't include creation
        AND DATEADD(mi,@offset,s.CreatedDateTime) >= @st_date --greater than start date
        AND DATEADD(mi,@offset,s.CreatedDateTime) <= @en_date --less than end date
        AND s.CreatedByTeam in ('IT Helpdesk','Unassigned') --check the team
        ) as ign enter code here
    ) as dp 
  

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

Любая помощь будет оценена

Комментарии:

1. Можете ли вы уточнить isn't returning accurate ? Можете ли вы привести нам несколько примеров данных и результатов…

2. Таким образом, смещение = 600 (по австралийскому времени) и для всего, что находится между началом (01/02/2014) и концом февраля (28/02/2014). В секундах запрос возвращает 193272 секунды из почти 500 строк. Тем не менее, я ищу что-то в 1000 иш в качестве возврата. Я полагаю, это может быть связано с тем, что DATEDIFF просматривает только минимальные и максимальные значения из строк, а не итеративно

3. Не могли бы вы проиллюстрировать проблему примером? Неясно, как две таблицы, из которых вы извлекаете данные, связаны друг с другом (как в «1: 1, 1: N, N: N?»). Хорошего и краткого примера того, как выглядят исходные наборы данных и какие выходные данные должны быть возвращены для них, может быть достаточно, чтобы прояснить это.

Ответ №1:

хотя вы могли бы сделать эту работу, это, вероятно, не лучший способ подойти к ней.

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

Любой из этих подходов был бы гораздо более удобочитаемым и, следовательно, гораздо более удобным в обслуживании, чем чрезвычайно сложный SQL-запрос.

Я бы ожидал, что он тоже будет работать лучше. На протяжении многих лет я постоянно видел, как простые select с доступом к вычислениям на основе курсора превосходят сложные операторы select .

Комментарии:

1. У меня нет проблем с переходом по пути хранимой процедуры. Я предполагаю, что моя ошибка — это отсутствие знаний SQL. Как будет выглядеть код преобразования?

2. Я согласен, что есть преимущества в реализации логики в хранимой процедуре, а не в пакете с несколькими операторами на стороне клиента, но из вашей формулировки ( «… или напишите хранимую процедуру, которая извлекает строки с помощью курсора …» ), кажется, что хранимая процедура необходима для одногоиспользовать курсор, что неверно для Transact-SQL. Или, может быть, я слишком много читаю.

3. Да, вы слишком много читаете. Дело в том, что ANSI SQL основан на операциях set, и это скорее построчный тип.проблемы.