Intereting Posts
Как эффективно хранить и управлять изображениями в SQL Server 2005 Выбор записей для годового отчета (за последние 3 года) Определение типа команды sql в триггере в SQL Server 2000 Переменная таблицы и NULLS Как создать пользователя на SQL-сервере, который имеет доступ только к одной таблице и может вставлять только строки Каков наилучший способ хранения исторических данных в SQL Server 2005/2008? Force Entity Framework использовать SQL-параметризацию для лучшего повторного использования кэша SQL proc Самый быстрый способ массового обновления SQL – псевдоним в операторах CASE Обновить все записи с таким же логическим значением, если по крайней мере одна запись соответствует критериям? Возврат последней записи для каждого столбца TSQL Проверьте, не истекают ли поля месяца и года SQL Server 2005 – Создание предложения WHERE Как использовать select top 1 sub query с левым соединением в SQL Заполните ваши таблицы данными мусора?

создание МНОЖЕСТВЕННЫХ агрегатов подгрупп

Я пытаюсь создать суб-записи с агрегатами, добытыми из существующих записей в наших данных. У меня есть таблица, в которой перечислены записи, с отношением «один ко многим» к другому, в котором перечислены действия для каждой записи. Таблица записей выглядит так:

Key OpenDate LastUpdate aa 1/1/2015 1/14/2015 bb 1/3/2015 1/15/2015 

Таблица действий выглядит так:

  Key Date Action aa 1/1/2015 Working aa 1/4/2015 Escalated aa 1/5/2015 Done aa 1/6/2015 Working aa 1/7/2015 Done aa 1/13/2015 Done aa 1/14/2015 Working bb 1/3/2015 Working bb 1/4/2015 Working bb 1/5/2015 Escalated bb 1/6/2015 Working bb 1/7/2015 Done bb 1/13/2015 Working bb 1/15/2015 Done 

Я хочу, чтобы иметь возможность создавать строку для каждого раза, когда запись «делается», которая отмечает начало и конец этого цикла, и подсчитывает некоторые элементы в этом диапазоне:

 Key SubID DateBegin DateEnd #Actions #Escalations aa 1 1/1/2015 1/5/2015 3 1 aa 2 1/6/2015 1/7/2015 2 0 aa 3 1/13/2015 1/13/2015 1 0 aa 4 1/14/2015 null 1 0 bb 1 1/3/2015 1/7/2015 5 1 bb 2 1/13/2015 1/15/2015 2 0 

В принципе, логика заключается в том, что субзапись заканчивается, когда значение Action = «Done», и новая субзапись начинается с любого последующего действия (а также самого первого действия).

Мне было показано решение, которое работает только для данных одной записи, но больше, чем один, дает мне проблемы. Я работаю с SQL Server 2008.

ОБНОВЛЕНИЕ. У меня есть несколько записей, но данные даты кажутся неправильными – не уверен, что он получает то, что он должен:

 SELECT Key, Cycles.CYCLE_BEGIN_DATE, Cycles.CYCLE_END_DATE, Cycles.NUM_ACTIONS_IN_CYCLE FROM Records FULL OUTER JOIN (select e.Key, min(Date) as CYCLE_BEGIN_DATE, max(case when Action = 'Done') then Date end) as CYCLE_END_DATE, count(*) as NUM_ACTIONS_IN_CYCLE from (select Key, Action, rowID = ROW_NUMBER() OVER (PARTITION BY Key ORDER BY Date asc), Date from Actions ) e outer apply (select count(*) as grp from (SELECT Key, rowID = ROW_NUMBER() OVER (PARTITION BY Reason_Key ORDER BY Date asc), Date, Action FROM Actions ) e2 where e2.Date < e.Date and e2.Action = 'Done' and e.Reason_Key = e2.Reason_Key ) e2 group by e.Reason_Key, e2.grp ) CYCLES on Records.Key = Cycles.Key 

Solutions Collecting From Web of "создание МНОЖЕСТВЕННЫХ агрегатов подгрупп"

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

В SQL Server 2012+ вы должны использовать совокупную функциональность сумм. В более ранних версиях вы можете сделать то же самое с коррелированным подзапросом или внешним применением.

Эта версия изменяет ваше значение несколькими способами. В частности, это упрощает логику определения grp . Мне не легко увидеть, как row_number() вписывается в запрос. Я понимаю логику – перечисляю сделанные действия и использую их для агрегации. Но получить эту ценность во всех строках в группе нетривиально.

 SELECT r.Key, a.CYCLE_BEGIN_DATE, a.CYCLE_END_DATE, a.NUM_ACTIONS_IN_CYCLE FROM Records r LEFT OUTER JOIN (select a.key, a2.grp, min(Date) as CYCLE_BEGIN_DATE, max(case when Action = 'Done') then Date end) as CYCLE_END_DATE, count(*) as NUM_ACTIONS_IN_CYCLE from actions a outer apply (select count(*) as grp from actions a2 where a2.key = a.key and a2.date < a.date and a2.action = 'Done' ) a2 group by a.key, a2.grp ) a on r.key = a.key;