2016-02-12 3 views
-1

У меня есть таблица ниже в OracleВыберите непревзойденные записей

Table1

ROW-ID | Fname |LName 
1  | P1  | xxxx 
1  | P1  | xxxx 
1  | P2  | xxxx 
1  | P2  | xxxy 
2  | P1  | xxxx 
3  | P2  | xxxx 

Мой выход должен выбрать только тот же ROW-ID, если будут внесены изменения в FName ИЛИ LName.

ROW-ID | Fname |LName 
1  | P2  | xxxx 
1  | P2  | xxxy 
+0

Вопрос не заполнен. «Изменение» делает ситуацию только с порядком вещей. Какой порядок? С вашим определением каждая строка подходит для ввода в выход. Кроме того, вы что-то попробовали или искали возможные решения? –

+0

Если ROW-ID совпадает с именем LName или FName, то выбирается эта строка. – suzeet

+0

Таблицы Oracle представляют собой таблицы «кучи». Нет порядка строк. Строка с xxxy может иногда встречаться первой. Итак, чтобы определить «изменение», вам нужно определить порядок или строки. –

ответ

2

Вы можете сделать это с помощью:

  • СЛУЧАЙ
  • LAG()

Например,

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, я добавил условие ИЛИ.

Смежные вопросы