Вы можете сделать это с помощью:
Например,
SQL> WITH sample_data AS(
2 SELECT 1 row_id, 'P1' Fname, 'xxxx' Lname FROM dual UNION ALL
3 SELECT 1 row_id, 'P1' Fname, 'xxxx' Lname FROM dual UNION ALL
4 SELECT 1 row_id, 'P2' Fname, 'xxxx' Lname FROM dual UNION ALL
5 SELECT 1 row_id, 'P2' Fname, 'xxxy' Lname FROM dual UNION ALL
6 SELECT 2 row_id, 'P1' Fname, 'xxxx' Lname FROM dual UNION ALL
7 SELECT 3 row_id, 'P2' Fname, 'xxxx' Lname FROM dual
8 )
9 -- end of sample_data mimicking real table
10 SELECT row_id,
11 Fname,
12 Lname
13 FROM
14 (SELECT row_id,
15 Fname,
16 Lname,
17 CASE
18 WHEN lag(Fname) over(partition BY row_id order by Fname) <> Fname
19 OR lag(Lname) over(partition BY row_id order by Lname) <> Lname
20 THEN 1
21 ELSE 0
22 END rn
23 FROM sample_data
24 )
25 WHERE rn = 1;
ROW_ID FNAME LNAME
---------- ----- -----
1 P2 xxxx
1 P2 xxxy
SQL>
Как это работает?
В принципе, вы хотите увидеть, когда произошло изменение при перемещении строк в заказе. Итак, LAG() сообщает, произошло ли изменение при сравнении с предыдущей строкой. Здесь CASE поможет вам сравнить. Так как вам нужен какой-либо из столбцов, Fname
или Lname
, я добавил условие ИЛИ.
Вопрос не заполнен. «Изменение» делает ситуацию только с порядком вещей. Какой порядок? С вашим определением каждая строка подходит для ввода в выход. Кроме того, вы что-то попробовали или искали возможные решения? –
Если ROW-ID совпадает с именем LName или FName, то выбирается эта строка. – suzeet
Таблицы Oracle представляют собой таблицы «кучи». Нет порядка строк. Строка с xxxy может иногда встречаться первой. Итак, чтобы определить «изменение», вам нужно определить порядок или строки. –