【问题标题】:repeat record in sql with respect to a column value关于列值在sql中重复记录
【发布时间】:2016-03-08 17:38:00
【问题描述】:

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

但我无法在 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%

我可以得到任何逻辑或建议来实现这一点吗?

谢谢!! :)

【问题讨论】:

  • SQL 表代表 无序 集。你有代表排序的列吗?
  • @GordonLinoff,没有戈登!我已经提到了完全相同的数据......
  • 给定的表是否已经在数据库中?还有更多的专栏吗?什么是主键?
  • @Recoil,是的,它是数据库中的一个表。但是没有定义键。对这个逻辑有什么想法吗?
  • 在这种情况下,Gordon Linoff 的答案可能是最好的答案。您需要一个参数来确保哪个条目相互依赖。数据库不会保证例如。第二行属于第一行。也许它属于第4行?你能看出问题吗?

标签: sql oracle11g oracle10g


【解决方案1】:

假设你有一列指定排序,你可以使用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;

【讨论】:

  • 您的意思是如果我按 ID 创建任何 rounum 列组,这可以帮助我实现这一目标吗?你说的是这个顺序吗?
  • @凯特。 . .是的。 SQL 表没有内在顺序,因此您的行可以按任何顺序排列。这使得你无法做你想做的事——除非另一列指定了顺序。
  • 我已经更新了这个问题。现在我在数据集中又多了一列。请立即检查....现在有电子邮件 ID 列。
【解决方案2】:

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

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

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;

【讨论】:

  • 正如@Recoil 指出的那样,这不是rowid 的正确用法。 Oracle 文档甚至没有声称rowid 以任何方式反映了插入顺序(因为它没有)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
相关资源
最近更新 更多