У меня есть следующая проблема, связанная с показаниями промышленного насоса. Насос обычно имеет счетчик, который ведет учет объема материала, обработанного этим конкретным c насосом. Иногда счетчик необходимо заменить на совершенно новый счетчик (показания счетчика начинаются с 0) или старый рабочий счетчик (показания счетчика могут быть больше 0). У меня есть набор данных, который ведет учет технического обслуживания насоса с показаниями счетчика. И индикация изменения счетчика только тогда, когда у нас есть данные в столбце OLD_METER_READING, в противном случае это пустое. В идеальном случае данные выглядят следующим образом:
PUMP_NO INSPECTION_DATE MAINTENANCE_TASK METER_READING OLD_METER_READING TOTAL_PUMP_LIFE
11 11-AUG-2000 A 12489 12489
11 14-JUL-2001 B 14007 14007
11 03-SEP-2002 Y 0 14007 14007
11 03-SEP-2002 C 0 14007 14007
11 03-SEP-2002 B 0 14007 14007
11 04-JUN-2003 A 1200 16007
11 21-DEC-2003 A 8000 22007
11 23-FEB-2004 Y 0 10000 24007
11 26-MAY-2004 B 10 24017
11 26-MAY-2004 P 20 24027
11 26-MAY-2004 R 300 24307
11 04-OCT-2004 B 2312 26319
11 31-MAR-2005 A 2889 26896
11 06-NOv-2006 V 5000 29007
11 14-JUL-2008 T 0 7000 31007
Однако во многих случаях специалист по насосам допускает ошибку при регистрации METER_READING во время смены счетчика. Таким образом, данные могут выглядеть примерно так:
PUMP_NO INSPECTION_DATE MAINTENANCE_TASK METER_READING OLD_METER_READING TOTAL_PUMP_LIFE
11 11-AUG-2000 A 12489 12489
11 14-JUL-2001 B 14007 14007
11 03-SEP-2002 Y 0 14007 14007
11 03-SEP-2002 C 0 14007 14007
11 03-SEP-2002 B 0 14007 14007
11 04-JUN-2003 A 1200 16007
11 21-DEC-2003 A 8000 22007
11 23-FEB-2004 Y 0 10000 24007
11 26-MAY-2004 B 10000 34007
11 26-MAY-2004 P 10000 34007
11 26-MAY-2004 R 10000 34007
11 04-OCT-2004 B 2312 26319
11 31-MAR-2005 A 2889 26896
11 06-NOV-2006 V 5000 29007
11 14-JUL-2008 T 0 7000 31007
Ошибка во втором наборе данных состоит в том, что технический специалист вместо регистрации фактического METER_READING использовал последний METER_READING из старого счетчика в качестве нового METER_READING в день 26-мая-2004. Тем не менее, правильный METER_READING был снова зарегистрирован с 4 октября 2004 года. У нас есть много случаев, когда для определенного c насоса (PUMP_NO) у нас будет ошибочный METER_READING, введенный в базу данных после события изменения счетчика. Это также создает неправильное и запутанное значение для TOTAL_PUMP_LIFE. Итак, чтобы исправить данные, мы хотим добавить еще один столбец в таблицу и обновить таблицу с помощью процедуры Oracle, где процедура будет проверять поле METER_READING со следующими логами c:
-
проверить данные между двумя последующими событиями смены счетчика. (например, в этом случае между 1-м счетчиком 03-SEP-2002 и 2-й сменой 23-FEB-2004. И снова между 2-й сменой 23-FEB-2004 и 3-й сменой 14-июль-2008).
, если METER_READING между любым из этих периодов выше в предыдущую дату по сравнению с METER_READING в предыдущую дату, тогда обновите более высокое METER_READING со вторым самым низким значением (0 и 2312 являются самыми низкими 2, поэтому обновление с 2312) в этом периоде.
Таким образом, период между первыми 2 изменениями счетчика пройдет, и обновление не потребуется. Однако во втором наборе даты все значения (10000) в столбце METER_READING для 26 мая 2014 года будет обновлено значение 2312.
Я не уверен, как написать PL \ SQL для сравнения значений между двумя событиями. а также как обновить значение предыдущей даты (если в столбце METER_READING обнаружено более высокое значение), указав меньшее значение между этим периодом.
База данных: Oracle SQL 11g