【问题标题】:How to replace a column value for the matching records within a table in Oracle如何替换Oracle中表中匹配记录的列值
【发布时间】:2019-06-12 05:12:40
【问题描述】:

我有一个表,其中包含一些匹配的员工值,即一个员工可能在多个部门。 我想根据他们的“姓名”和“出生日期”来识别这些记录。如果相同,则将“id”替换为小数的增量。 在下面的示例中:Mike 在 2 个部门(IT、财务)所以我希望他的 IT 部门 ID(作为小数的增量)在最终结果中。 Base id 可以在基础部门 IT 上识别。

请告诉我该怎么做?

【问题讨论】:

  • 我们如何知道12id 的基础john 值,而不是89?一般来说,这可能并不明确或不可能。
  • 基于部门(IT)
  • 基于部门(IT)?这意味着什么?如果ken 在财务和人力资源部门,因此没有一行在 IT 中怎么办?蒂姆的问题非常有道理。你的答案没有。请注意,这个问题与编程无关——它与业务问题本身有关(现阶段与计算机或数据库无关)。
  • 我只想替换 IT 部门员工的 id
  • "将“id”替换为小数点的增量。"这是什么意思?

标签: sql oracle


【解决方案1】:

让我们用最小 id 和行号除以 10:

SELECT
  MIN(id) OVER(PARTITION BY name, dob) + ((ROW_NUMBER() OVER(PARTITION BY name, dob ORDER BY id)-1)/10 as id,
  name,
  dob,
  department
FROM
  emp

我选择了员工的最小 ID 作为基本 ID。如果您有不同的策略,例如您希望 IT 部门 id 形成基值,而不是 MIN(id) 考虑类似FIRST_VALUE(id) OVER(PARTITION BY ... ORDER BY case when department = 'it' then 0 else 1 end)

我同意蒂姆的观点;您的很多问题似乎都不清楚,说明不清楚或没有完全考虑清楚。如果一个 emp 在 10 个部门并且发生 id 冲突怎么办?一般来说,我们不关心身份证号码是什么,所以我们不会更改它或尝试填补空白等

【讨论】:

  • 谢谢 Caius,我可以通过使用表本身的自联接来做到这一点吗?
猜你喜欢
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 2017-07-19
  • 1970-01-01
相关资源
最近更新 更多