3

DB からサンプル値を取得する SQL ステートメントを作成しようとしています。テーブルには、CNC マシンの工具交換に関連する値が含まれています。私が持っている現在のステートメントは値を適切に引き出しますが、特定のプログラムに対してツールが 1 回出現する場合のみです。ツールが複数回表示される場合、時間の値は最初のロードから最後のロードまでに対応します。TIME 列は 1 つしかなく、その最初と最後の発生を見つけることで、ツールのイン/アウト時間を判断できます。

基本的な例:

Raw Data:
Tool_Number    TIME    
100            12:00
100            12:01
100            12:02
100            12:03

Current Query Returns: 
Tool_Number    TIME_IN     TIME_OUT    
100            12:00       12:03

ただし、TOP および DISTINCT ルールを使用できなくなったため、ツールが複数回表示されると事態は複雑になります。

Raw Data:
Tool_Number    TIME    
100            12:00
100            12:01
100            12:02
100            12:03
200            12:04
200            12:05
100            12:06
100            12:07

Current Query Returns: 
Tool_Number    TIME_IN     TIME_OUT    
100            12:00       12:07
200            12:04       12:05

Ideal Query Returns:
Tool_Number    TIME_IN     TIME_OUT    
100            12:00       12:03
200            12:04       12:05
100            12:06       12:07

私たちは時間分析を行っていますが、もちろん、これは合計時間値を大幅に台無しにしています。現在のクエリは次のとおりです。

SELECT * FROM (SELECT DISTINCT SPINDLE_POT FROM TBL_SPINDLE_DATA_M1 
WHERE TIME BETWEEN '4/3/20131:24:13 PM' AND '4/3/2013 3:07:33 PM') AS A 

CROSS APPLY

((SELECT TOP 1 TIME FROM TBL_SPINDLE_DATA_M1 B WHERE B.SPINDLE_POT = A.SPINDLE_POT AND
TIME BETWEEN '4/3/2013 1:24:13 PM' AND '4/3/2013 3:07:33 PM') AS NEWTABLE1

JOIN

(SELECT TOP 1 TIME FROM TBL_SPINDLE_DATA_M1 B WHERE B.SPINDLE_POT = A.SPINDLE_POT 
AND TIME BETWEEN '4/3/2013 1:24:13 PM' AND '4/3/2013 3:07:33 PM' ORDER BY TIME DESC) 
AS NEWTABLE2 ON (0=0))

私は決して SQL クエリの専門家ではありません。上記のクエリはひどく間違っている可能性がありますが、実際には必要なものが返されます。似たようなアイテムをグループ化する方法はありますが、インデックスが互いに接触していない場合はグループ化しないように十分に注意してください。

4

2 に答える 2