在sql中重复关于列值的记录

时间:2016-03-07 12:52:35

标签: sql oracle11g oracle10g

我正在寻找任何逻辑来将这些数据从以下格式中删除。

但是我无法在sql中找到任何实现此目的的逻辑。

给出表

ID                   Country         AreaDiscount        Email  
AB0215000001         Belgium         120 cm + 10%        Abc@gmail.com
                                     130 cm + 20%        Abc@gmail.com
                                     140 cm + 30%        Abc@gmail.com
AB0215000002         Spain           220 cm + 30%        Bcd@gmail.com
                                     1420 cm + 30%       Bcd@gmail.com
                                     1520 cm + 10%       Bcd@gmail.com

必需

ID                   Country         AreaDiscount
AB0215000001         Belgium         120 cm + 10%
AB0215000001         Belgium         130 cm + 20%
AB0215000001         Belgium         140 cm + 30%                                                
AB0215000002         Spain           220 cm + 30%
AB0215000002         Spain           1420 cm + 30%
AB0215000002         Spain           1520 cm + 10%

我可以得到任何逻辑或建议吗?

谢谢!! :)

2 个答案:

答案 0 :(得分:1)

假设您有一个指定排序的列,您可以使用var createIndexStatements = db.GetDialectProvider().ToCreateIndexStatements(typeof(NetworkPart)); var createIndexStatement = createIndexStatements.FirstOrDefault(stmt => stmt.Contains("uidx_networkpart_networkpart1_networkpart2")); db.ExecuteSql(createIndexStatement);

lag(. . . ignore nulls)

答案 1 :(得分:0)

我完全赞同戈登·林诺夫。

您可以尝试以下方法,这与他的答案略有不同:

SELECT NVL(ID, NVL(LAG(ID IGNORE NULLS) OVER(ORDER BY ROWID), ID)) AS ID,
       NVL(COUNTRY, NVL(LAG(COUNTRY IGNORE NULLS) OVER(ORDER BY ROWID), COUNTRY)) AS COUNTRY,
       AREADISCOUNT
FROM   TAB1 T
ORDER  BY ROWID;

但要小心。在这个问题上使用rowid并不是真正的“最佳实践”,你必须详细检查结果的正确性!

<强>更新

使用附加列,您可以将其用于分组/排序:

SELECT NVL(ID, NVL(LAG(ID IGNORE NULLS) OVER(ORDER BY EMAIL), ID)) AS ID,
       NVL(COUNTRY, NVL(LAG(COUNTRY IGNORE NULLS) OVER(ORDER BY EMAIL), COUNTRY)) AS COUNTRY,
       AREADISCOUNT,
       EMAIL
FROM   TAB1 T
ORDER  BY ID, AREADISCOUNT;