关于列值在 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;
我正在寻找将此数据转换为以下格式的任何逻辑。
但我无法在 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;