关于列值在 sql 中重复记录

repeat record in sql with respect to a column value

我正在寻找将此数据转换为以下格式的任何逻辑。

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

给定 Table

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%

我能得到任何逻辑或建议来实现这个目标吗?

谢谢!! :)

假设您有一列指定排序,您可以使用 lag(. . . ignore nulls):

select lag(id ignore nulls) over (order by orderingcol) as id,
       lag(country ignore nulls) over (order by orderingcol) as country,
       areadiscount
from t;

我完全同意戈登·利诺夫的观点。

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

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在这件事上的使用并不是真的"best practice",你必须详细检查结果的正确性!

更新

有了额外的列,您可以为 grouping/ordering:

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;