Oracle SQL - Выбор записей в группы и фильтрация на основе сравнения строки 1 + строки 2 - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть база данных, которая содержит данные об отслеживаемых производственных машинах, в которых эти поля находятся (и более):

ID | WORK_ORDER_ID | WORK_CENTER_ID | MFGNO | ...

Записи представляют собой данные в реальном времени и вводятся последовательно в зависимости от изменения work_order_id,Я хочу проверить между рабочими заданиями, является ли MFGNO одинаковым, но сгруппированным на основе work_center_id.

Например:

1. 998 | 100 | 205 | TEST_MFG
2. 997 | 100 | 205 | TEST_ MFG

Это вернет true (или 1 строку), так как mfgno одинаковы.

В настоящее время я могу сделать это длякаждый work_center_id по отдельности выглядит следующим образом:

SELECT * FROM
(
  select * FROM (select ID, WORKORDER_ID, TIMESTAMP, MFGNO from 
  HIST_ILLUM_RT where WORK_CENTER_ID = 5237
  ORDER BY ID desc) where rownum = 1
)
where MFGNO = ( 
    SELECT mfgno FROM
     (
     select * FROM (select ID, WORKORDER_ID, TIMESTAMP, MFGNO from 
     HIST_ILLUM_RT where WORK_CENTER_ID = 5237 
      ORDER BY ID desc
     ) where rownum < 3 order by id asc
    ) where rownum = 1
)

Это создает либо 0 строк, если нет текущих спина к спине MFGNO, то 1>, если есть.

Таким образом, я должен написать этовыражение для каждого отдельного work_center_id (около 40).Я хочу иметь выражение, которое проверяет две верхние строки каждого сгруппированного work_center_id и возвращает строку только в случае совпадения MFGNO.

Например:

1. 998 | 101 | 205 | TEST_MFG
2. 997 | 098 | 206 | SomethingElse
3. 996 | 424 | 205 | TEST_MFG
4. 995 | 521 | 206 | NotAMatch
5. 994 | 123 | 205 | Doesn'tCompareThis
6. 993 | 664 | 195 | Irrelevant

Для этого он вернет только1, так как только у work_center_id = 205 есть спина к спине (строки 1 и 2) MFGNO, по сравнению с 206. Например, нет.

Я использую Oracle 11g, который, как мне кажется, ограничивает меня, но яЯ не могу обновить или найти способ создания этого выражения в текущей версии.

1 Ответ

0 голосов
/ 28 ноября 2018

Я думаю вы хотите lag() и немного логики:

select count(*)
from (select t.*,
             lag(MFGNO) over (partition by WORK_CENTER_ID order by id) as prev_mfgno
      from t
     ) t
where prev_mfgno = mfgno
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...