仅选择不匹配的记录

时间:2016-02-12 06:10:31

标签: sql oracle

我在Oracle下面有一张表

Table1

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

如果FName或LName会有变化,我的输出应仅为相同的ROW-ID选择。

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

1 个答案:

答案 0 :(得分:2)

你可以使用:

  • CASE
  • LAG()

例如,

.phone buton{
  opacity: 1
}

如何运作?

基本上,您希望在遍历订单中的行时查看更改发生的时间。因此, LAG()会告诉您在将其与上一行进行比较时是否发生了更改。这是 CASE 帮助您进行比较的地方。由于您需要任何列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> Fname,因此我添加了 OR 条件。