O_Diagnosis操作に基づいてグループ番号を生成しようとしています。私は現在のO_Diagnosis操作と次のO_Diagnosis操作の間で操作をグループ化したいと思います。SQL生成グループ番号
問題は、このデータにはグループ化可能な列がないことです。ですから、私はこの列をゼロからほとんど生成する必要があります。
Site SFC Date Time Operation Times_processed Diagnosis_group_nr
P500 B218YW 2017-03-21 10:16:23 O_SF_WRAP 1 1
P500 B218YW 2017-03-23 06:07:53 O_SF_WRAP_CURE 1 1
P500 B218YW 2017-03-23 14:23:41 O_DIAGNOSIS 1 2
P500 B218YW 2017-03-28 10:07:55 O_SF_WRAP 2 2
P500 B218YW 2017-03-28 15:02:21 O_SF_WRAP_CURE 2 2
P500 B218YW 2017-03-29 20:38:06 O_DIAGNOSIS 2 3
P500 B218YW 2017-03-29 20:39:15 O_DIAGNOSIS 3 4
P500 B218YW 2017-04-27 08:43:53 O_SF_WRAP 3 4
P500 B218YW 2017-04-27 12:43:25 O_SF_WRAP_CURE 3 4
P500 B218YW 2017-04-27 13:05:16 O_SF_PCA_ASSEMBLY 1 4
P500 B218YW 2017-04-27 13:19:15 O_DIAGNOSIS 4 5
P500 B218YW 2017-04-27 15:23:09 O_SF_PCA_ASSEMBLY 2 5
P500 B218YW 2017-04-27 16:10:32 O_SF_ELEC_INT_TEST 1 1
P500 B218YW 2017-04-27 22:16:23 O_RECORD_REVIEW 1 1
[処理済み時間]列には、SFCが操作を実行した回数がカウントされます。そのため、O_SF_WRAPの例では1が表示され、次回にO_DiagnosisからSFCが返された場合は2に変更されます。
これを実現するには、関数または多分SQLビューを作ることはできますか?これは、これまでの私のコードです
Site SFC Date Time Operation Times_processed Diagnosis_group_nr
P500 B218YW 2017-03-21 10:16:23 O_SF_WRAP 1 1
P500 B218YW 2017-03-23 06:07:53 O_SF_WRAP_CURE 1 1
P500 B218YW 2017-03-23 14:23:41 O_DIAGNOSIS 1 2
P500 B218YW 2017-03-28 10:07:55 O_SF_WRAP 2 2
P500 B218YW 2017-03-28 15:02:21 O_SF_WRAP_CURE 2 2
P500 B218YW 2017-03-29 20:38:06 O_DIAGNOSIS 2 3
P500 B218YW 2017-03-29 20:39:15 O_DIAGNOSIS 3 3
P500 B218YW 2017-04-27 08:43:53 O_SF_WRAP 3 3
P500 B218YW 2017-04-27 12:43:25 O_SF_WRAP_CURE 3 3
P500 B218YW 2017-04-27 13:05:16 O_SF_PCA_ASSEMBLY 1 4
P500 B218YW 2017-04-27 13:19:15 O_DIAGNOSIS 4 4
P500 B218YW 2017-04-27 15:23:09 O_SF_PCA_ASSEMBLY 2 2
P500 B218YW 2017-04-27 16:10:32 O_SF_ELEC_INT_TEST 1 1
P500 B218YW 2017-04-27 22:16:23 O_RECORD_REVIEW 1 1
:
WITH
cteNextRow
AS
(
SELECT
opl.[PL SITE]
, opl.[PL SFC]
, opl.[Pl End Time Local]
, opl.[PL OPERATION]
, LEAD(opl.[PL OPERATION], 1) OVER (PARTITION BY opl.[PL SFC] ORDER BY opl.[Pl End Time Local]) AS NEXT_OPERATION
, LEAD(opl.[Pl Times Processed], 1) OVER (PARTITION BY opl.[PL SFC] ORDER BY opl.[Pl End Time Local]) AS NEXT_TIMES_PROCESSED
, max(opl.[Pl Times Processed]) OVER (PARTITION BY opl.[PL SFC] ORDER BY opl.[PL SFC], opl.[Pl End Time Local]
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) TOTAL_TIMES_PROCESSED
,LAST_VALUE(opl.[PL OPERATION]) OVER (PARTITION BY opl.[PL SFC] ORDER BY opl.[PL SFC], opl.[Pl End Time Local]
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) as LAST_OPERATION
,case when LAST_VALUE(opl.[PL OPERATION]) OVER (PARTITION BY opl.[PL SFC] ORDER BY opl.[PL SFC], opl.[Pl End Time Local]
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) not like '%review%'
then 0
when LAST_VALUE(opl.[PL OPERATION]) OVER (PARTITION BY opl.[PL SFC] ORDER BY opl.[PL SFC], opl.[Pl End Time Local]
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) like '%review%' and max(opl.[Pl Times Processed]) OVER (PARTITION BY opl.[PL SFC] ORDER BY opl.[PL SFC], opl.[Pl End Time Local]
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) = 1
then 1
else 9999
end as REVIEW_IND
FROM Report1 opl
where [pl sfc] = 'B218YW'
)
select
opl.[pl Site] AS PROCESS_SITE
, opl.[PL SFC] AS PROCESS_SFC
, opl.[Pl End Time Local] PROCESS_DATE_TIME
, opl.[PL OPERATION] AS PROCESS_OPERATION
, cte.NEXT_OPERATION AS PROCESS_NEXT_OPERATION
, opl.[Pl Times Processed] AS PROCESS_TIMES_PROCESSED
, CASE
when cte.REVIEW_IND = 9999 and cte.NEXT_TIMES_PROCESSED = opl.[Pl Times Processed] and cte.NEXT_OPERATION like '%DIAG%'
then LEAD(opl.[Pl Times Processed], 1) OVER (PARTITION BY opl.[PL SFC] ORDER BY opl.[Pl End Time Local])
when cte.REVIEW_IND = 9999 and cte.NEXT_TIMES_PROCESSED < opl.[Pl Times Processed]
then opl.[Pl Times Processed]
when cte.REVIEW_IND = 9999 and NEXT_TIMES_PROCESSED is null
then opl.[Pl Times Processed]
when cte.REVIEW_IND = 9999 and cte.NEXT_TIMES_PROCESSED is not null
then cte.NEXT_TIMES_PROCESSED
else REVIEW_IND
END AS Diagnosis_group_nr
FROM Report1 opl
join cteNextRow cte on cte.[PL SITE] = opl.[pl Site] and cte.[PL sfc] = opl.[PL SFC] and cte.[pl operation] = opl.[pl OPERATION] and opl.[Pl End Time Local] = cte.[Pl End Time Local]
目的の出力の最後の2行でグループ化が「1」にリセットされるのはなぜですか? – iamdave
診断ステップの間の行は、廃棄物と労働としてカウントされ、残りは良品と見なされた後にカウントされます。だから私はこれを数えなければなりません。しかし、私は報告ソリューションでこれを行うことができます.. – hvdbunte