我正在寻找任何逻辑来将这些数据从以下格式中删除。
但是我无法在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%
我可以得到任何逻辑或建议吗?
谢谢!! :)
答案 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;