2010-12-02 2 views
0

문제를 설명하는 데 훨씬 간단한 방법이있는 것 같습니다. 샘플 표 다음에있는 편집 2를 참조하십시오.데이터에 실행 번호가없는 경우 실행별로 그룹화 (생산 실행 길이 변경으로 인해 빌드 시간에 미치는 영향 표시)

저는 생산 라인에서 다양한 제품을 보유하고 있습니다. 각 제품이 생산에 들어간 날짜가 있습니다. 각 제품에는 두 개의 식별자가 있습니다. 품목 번호와 일련 번호 품목 번호와 일련 번호별로 각 제품의 총 노동 시간이 있습니다 (즉, 제조 된 각 객체에 얼마나 많은 시간이 들어 왔는지, 그리고 평균 빌드 시간 시간은 각 종류의 객체에 대한 것입니다).

생산 실행 시간을 변경하는 방법이 제품을 만드는 데 걸리는 평균 시간 (항목 번호)에 영향을 미치는 방식을 결정하고 싶습니다. 생산 실행은 단일 품목 번호에 대해 여러 일련 번호를 순차적으로 생산하는 것입니다. 우리는 1 년에서 30 년까지 다양한 생산 작업을 통해 수년간의 역사적인 기록을 가지고 있습니다.

나는 이것을 달성하기 위해 '실행 ID'를 할당 할 수 있어야한다고 생각합니다. 나에게 이것은 시작 날짜별로 정렬하고 항목 번호가 변경 될 때마다 새로운 고유 값을 계산하는 쿼리를 만드는 것을 의미합니다. 그렇게하는 방법을 알고 있다면, 나머지 문제는 스스로 해결할 수 있습니다. 내가 올바른 방법이 생각

  1. 암 :

    은 그래서 관련된 일련의 질문을 제시?

  2. 내가 올바른 길을 가고있다면 어떻게 그 id 값을 생성 할 수 있습니까? 직접 쿼리에 대한 선호도가 잘못되었지만 계산 및 저장은 옵션입니다. Excel에서 실행 번호를 생성하는 방법을 정확히 알고 있지만 데이터베이스에서이 작업을 수행하는 데 잘못된 (?) 환경 설정이 있습니다.
  3. 내가 옳은 길을 걷지 않는다면, 그 길은 어디에서 찾을 수 있습니까? :)

편집 : 샘플 데이터 간체 테이블 구조는 :

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 

I 직렬 그 시작일 도시했으며 autoID 서로 무관하다. 나는 달리기가 길어짐에 따라 노동량이 감소 할 것이라는 기대를 보였다. (그러나 이것은 데이터 분석이 아닌,받은 지혜를 통해서만 '사실'이다.) 필자는 솔루션의 핵심으로 생각한 것을 보여주었습니다. 단일 항목의 순차적 빌드를 반영하는 RunID입니다. 그 runID를 얻을 수 있다면, 카운트, 평균, 합계, 최대, 최소 등을 얻기 위해 뛰기로 그룹화 할 수 있다는 것을 알고 있습니다. 또한 실행 시작부터 퍼센트 변경을 할 수 있습니다. 이 시점에서 나는 모든 아이템에 대해 전 세계적으로 또는 아이템별로 각기 다른 런 길이와 연관된 경향을 그래프로 나타낼 수 있습니다. (적어도 나는 모든 것을 할 수 있다고 생각한다. 조금은 진절머리가 나야하지만, 나는 그것을 끝낼 수 있다고 생각한다.)

편집 2 :이 문제는 다음과 같이 보일 것이다. runID가 없으면 각 실행의 'member (가장 빠른 시작 날짜)'를 시작 하시겠습니까? 합니다 (runID가 존재하지 않습니다 샘플 표에 나타난 나는 원래 runID을 계산 할 수있는 것은 잠재적으로 실행 가능한 해결책이라고 제시했다.)

AutoID Item 
1   Legend 
4   Apex 
6   Legend 

내가의 첫 번째 멤버를 찾는 방법을 배운 겠지 각각의 실행은 내가 각 실행의 마지막 멤버를 찾은 다음이 두 결과를 사용하여 각 실행의 다른 모든 멤버를 얻는 방법을 배웠습니다.

편집 3 : 실행중인 모든 항목의 RunID로 실행중인 첫 번째 항목의 AutoID를 사용하는 쿼리의 편집 버전입니다.이것은 받아 들여진 대답이있는 Simon에 의해 제공된 견본과 방향에서 전체로 건설되었다. 이것을 실행별로 그룹화하는 기초로 사용하여 다양한 실행 통계를 생성 할 수 있습니다.

FROM runID, run_sibling.AutoID AS 항목 ID, run_sibling.Item, run_sibling.Serial, run_sibling.StartDate, run_sibling.Hours AS SELECT first_product_of_run.AutoID (first_of_run.AutoID, first_of_run.Item, first_of_run.Serial, first_of_run.StartDate를 선택 , dbo.production FROM first_of_run.Hours 는 AS first_of_run LEFT OUTER는 dbo.production 가입 earlier_in_run ON first_of_run.AutoID AS - 1 = earlier_in_run.AutoID AND first_of_run.Item = earlier_in_run.Item WHERE (earlier_in_run.AutoID가 NULL)) AS first_product_of_run LEFT OUTER JOIN dbo.production AS 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 product_between.Item AND first_product_of_run.StartDate

답변

1

테이블 구조를 좀 더 설명해 주시겠습니까? "각 제품이 생산에 들어간 날짜"가 전체 시간 소인이거나 제품간에 일련 번호가있는 경우 실행의 첫 번째 및 마지막 제품을 식별하는 쿼리를 작성할 수 있습니다. 그로부터 ID를 할당하거나 실행 길이를 계산할 수 있습니다.

편집 :

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이 될 수 있습니다 당신은 1,4를 확인하면 , 6 실행의 시작, 당신은 실행의 다른 ID를 찾으려면이 쿼리를 사용할 수 있습니다 임시 테이블, 테이블 변수 또는 하위 쿼리를 실행할 수 있습니다. 열쇠는 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 

사용하여 외부 상황이 여전히 내 머리를 비틀어하지 않는 경우 찾을 조인,하지만 매우 강력한 기술이다.

+0

@ 시몬 : 표 구조 및 추가 설명에 대한 편집 내용을 참조하십시오. 내가 주어진 항목의 첫 번째와 마지막 날짜를 식별하는 방법을 알고 있지만 주어진 run에 대한 항목을 검색하는 방법을 모르겠다. 왜냐하면 주로 runID가 없기 때문이다. – jadero

+0

실행 ID가 순차적 일 필요가 없다면 실행중인 첫 번째 제품의 AutoID를 사용하는 것이 좋습니다. – Simon

+0

@ 시몬 : 당신은 제가 물어야 할 질문을 정확히 볼 수있게 도와주었습니다 : 어떻게 각각의 실행의 '시작 멤버'를 식별합니까? (나는 'finishing member'를 얻고 결과를 결합하여 각 멤버를 얻는 것을 쉽게 수정할 수 있다고 가정합니다.) Edit 2 – jadero

관련 문제