У меня есть таблица из 100 000 строк, и один столбец - это повторяющаяся серия чисел, представляющих «точку» в производственной линии робота.Мне нужно определить, когда меняется повторяющаяся последовательность.Последовательность состоит из четного числа и нечетного числа по обе стороны.Следовательно, числа в данной последовательности находятся на расстоянии 1 или 2, например, 32, 31, 33, 31, 33, 31, 33, 32, 31, 32, 31, 33, 32. Порядок трех чисел является случайным, за исключениемчисло не может следовать за собой.Последовательность может измениться, например, 33, 32, 31, 33, 31, 33, 31, 32, 31, 32, 33, 44, 45, 44, 43, 45, 43, 45, 43, 44, 29, 30,31, 29, 31, 30, 31, 29, 31, 29, 30,.,,
Я хочу иметь возможность обнаруживать каждое изменение в последовательности и помечать каждое изменение с 1 (оставляя значение по умолчанию 0 в строках, где нет изменений).
Там, где нет уверенности в том, принадлежит ли число к той или иной последовательности, например, 32, 31, 33, 33, 31, 30, 29, 30, 31 (последовательность была изменена с одной на около 32 наодин из которых основан на 30) предполагается, что последнее число, которое может принадлежать любой последовательности, относится к начальной последовательности.
Каждый шаг в последовательности чисел имеет уникальный идентификатор MoveID, разделенный по средствам и robotNum.
Я пытался использовать опережающие и запаздывающие числа для получения чисел до и после «пятна», находя разницу между суммой трех чисел перед точкой и суммой трех чисел после точки, чтобы увидетьесли разница превышает определенные пределы, что указывает на изменение в последовательности.(См. Следующий код).
SELECT moveID, facility, robotNum, spot,
CASE WHEN (((lastSpot1 + lastSpot2 + lastSpot3) - (nextSpot1 + nextSpot2 + nextSpot3))/3 BETWEEN -1.3 AND 1.3 )
THEN 1
ELSE 0
END
AS sequenceChange
FROM
( SELECT facility, robotNum,
, LEAD(spot,1,0) OVER(PARTITION BY facility, robotNum ORDER BY facility, robotNum, moveID ) AS nextSpot1
, LEAD(spot,2,0) OVER(PARTITION BY facility, robotNum ORDER BY facility, robotNum, moveID ) AS nextSpot2
, LEAD(spot,3,0) OVER(PARTITION BY facility, robotNum ORDER BY facility, robotNum, moveID ) AS nextSpot3
, LAG(spot,1,0) OVER(PARTITION BY facility, robotNum ORDER BY facility, robotNum, moveID ) AS lastSpot1
, LAG(spot,2,0) OVER(PARTITION BY facility, robotNum ORDER BY facility, robotNum, moveID ) AS lastSpot2
, LAG(spot,3,0) OVER(PARTITION BY facility, robotNum ORDER BY facility, robotNum, moveID ) AS lastSpot3
FROM SequenceTable1
) t1
ORDER BY facility, robotNum, moveID.
Однако этот метод ненадежен, поскольку сумма первых 3 цифр некоторых различных последовательностей перекрывается.Необходим некоторый способ «усилить» разницу, чтобы изменения могли быть обнаружены более надежно, и 1 обновляется в столбце «sequenceChange» в начале каждой новой последовательности.