Группировка по прогону, когда в данных нет номера прогона (было показано, как изменение длины производственного прогона влияет на время сборки) - PullRequest
0 голосов
/ 02 декабря 2010

Казалось бы, существует гораздо более простой способ сформулировать проблему. Пожалуйста, см. Редактировать 2, следуя образцу таблицы.

У меня есть несколько различных продуктов на производственной линии. У меня есть дата, когда каждый продукт поступил в производство. Каждый продукт имеет два идентификатора: номер изделия и серийный номер. У меня есть общее количество рабочих часов для каждого продукта по номеру изделия и серийному номеру (т.е. я могу сказать, сколько часов ушло на каждый изготовленный объект и какова средняя сборка. время для каждого вида объекта).

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

Я думаю, что для этого мне нужно назначить 'run id'. Для меня это означает создание запроса, который сортирует по дате начала и вычисляет новое уникальное значение при каждом изменении номера элемента. Если бы я знал, как это сделать, я мог бы решить остальную часть проблемы самостоятельно.

Так что предлагается ряд связанных вопросов:

  1. Думаю ли я об этом правильно?
  2. Если я на правильном пути, как мне сгенерировать эти значения идентификатора прогона? Рассчитать и сохранить это вариант, хотя у меня есть (ошибочно?) Предпочтение для прямых запросов. Я точно знаю, как создать номера прогонов в Excel, но у меня есть (ошибочное?) Предпочтение делать это в базе данных.
  3. Если я не на правильном пути, где я могу найти этот путь? :)

Edit: Структура таблицы (упрощенная) с образцами данных:

AutoID    Item       Serial     StartDate    Hours     RunID (proposed calculation)
 1         Legend     1234       2010-06-06     10        1
 3         Legend     1235       2010-06-07      9        1
 2         Legend     1237       2010-06-08      8        1
 4         Apex       1236       2010-06-09     12        2
 5         Apex       1240       2010-06-10     11        2
 6         Legend     1239       2010-06-11     10        3
 7         Legend     1238       2010-06-12      8        3

Я показал, что дата начала, серийный номер и autoID не связаны друг с другом. Я показал ожидание того, что рабочая сила снижается с увеличением длины пробега (но это «факт» только благодаря полученной мудрости, а не анализу данных). Я показал то, что я представляю как основу решения, - это RunID, который отражает последовательные сборки одного элемента. Я знаю, что если бы я мог получить этот runID, я мог бы группировать по прогонам, чтобы получить счетчики, средние значения, итоги, максимум, мин и т. Д. Кроме того, я мог бы сделать что-то вроде часов /, чтобы получить процентное изменение с начала прогона. В этот момент я мог бы построить график тенденций, связанных с разными длинами прогонов, либо глобально для всех элементов, либо для каждого элемента в отдельности. (По крайней мере, я думаю, что смогу сделать все это. Возможно, мне придется немного поработать, но я думаю, что смогу это сделать.)

Редактировать 2: Эта проблема может выглядеть следующим образом: как получить «начальный» член (самая ранняя дата начала) каждого прогона, когда у меня еще нет runID? (RunID, показанный в примере таблицы, не существует, и я изначально предполагал, что возможность рассчитать runID была потенциально жизнеспособным решением.)

AutoID    Item 
 1         Legend
 4         Apex   
 6         Legend

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

Редактировать 3: моя версия запроса, которая использует AutoID первого элемента в прогоне в качестве RunID для всех единиц в прогоне. Это было построено полностью из образцов и руководства, предоставленного Саймоном, у которого есть принятый ответ. Используя это в качестве основы для группировки по прогонам, я могу создавать различные статистические данные прогонов.

ВЫБЕРИТЕ first_product_of_run.AutoID AS runID, run_sibling.AutoID AS itemID, run_sibling.Item, run_sibling.Serial, run_sibling.StartDate, run_sibling.Hours FROM (ВЫБЕРИТЕ first_of_run.AutoID, first_of_run.Item, first_of_run.Serial, first_of_run.StartDate, first_of_run.Hours ИЗ dbo.production КАК first_of_run ВЛЕВО НАРУЖНОЕ dbo.production AS ранее_in_run ON first_of_run.AutoID - 1 = ранее_ин_run.AutoID Иfirst_of_run.Item = earlier_in_run.Item ГДЕ (earlier_in_run.AutoID IS NULL)) КАК first_product_of_run LEFT OUTER JOIN dbo.production AS run_sibling ПО first_product_of_run.Item = run_sibling.Item И first_product_of_run.AutoID run_sibling.AutoID И first_product_of_run.StartDate product_between.Item И first_product_of_run.Дата начала

1 Ответ

1 голос
/ 02 декабря 2010

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

Edit: После того как вы определили 1,4 и 6 в качестве начала прогона, вы можете использовать этот запрос, чтобы найти другие идентификаторы в прогоне:

select first_product_of_run.AutoID, run_sibling.AutoID
from first_product_of_run
left join production run_sibling on first_product_of_run.Item = run_sibling.Item
    and first_product_of_run.AutoID <> run_sibling.AutoID
    and first_product_of_run.StartDate < run_sibling.StartDate
left join production product_between on first_product_of_run.Item <> product_between.Item
    and first_product_of_run.StartDate < product_between.StartDate
    and product_between.StartDate < run_sibling.StartDate
where product_between.AutoID is null

first_product_of_run может быть временной таблицей, табличной переменной или подзапросом, который вы использовали для поиска начала прогона. Ключ where product_between.AutoID is null. Это ограничивает результаты только парами, в которых между ними не было создано никаких других элементов.

Изменить 2, вот как получить первый из каждого запуска:

select first_of_run.AutoID
from 
(
select product.AutoID, product.Item, MAX(previous_product.StartDate) as PreviousDate
from production product
left join production previous_product on product.AutoID <> previous_product.AutoID
    and product.StartDate > previous_product.StartDate
group by product.AutoID, product.Item
) first_of_run
left join production earlier_in_run
    on first_of_run.PreviousDate = earlier_in_run.StartDate
    and first_of_run.Item = earlier_in_run.Item
where earlier_in_run.AutoID is null

Это не красиво, и сломается, если StartDate не уникально. Запрос можно упростить, добавив последовательный и уникальный идентификатор без пробелов. Фактически, этот шаг, вероятно, будет необходим, если StartDate не уникален. Вот как это будет выглядеть:

select first_of_run.AutoID
from production first_of_run
left join production earlier_in_run
    on (first_of_run.Sequence - 1) = earlier_in_run.Sequence
    and first_of_run.Item = earlier_in_run.Item
where earlier_in_run.AutoID is null

Использование внешних объединений, чтобы найти, где что-то еще не искажает мой мозг, но это очень мощная техника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...