【问题标题】:Duplicate id rows with few columns to unique id row with many columns Oracle SQL将具有少量列的 id 行复制到具有多列 Oracle SQL 的唯一 id 行
【发布时间】:2020-06-26 03:45:39
【问题描述】:

我有一张可以装一到四个路灯的杆子桌。每行都有一个灯杆 ID 和路灯类型(描述)。我需要 ID 是唯一的,每个可能的路灯都有一列。类型/描述可以是 26 个字符串中的任何一个。

我有这样的事情:

ID   Description
----------------
1    S 400
1    M 200
1    HPS 1000
1    S 400
2    M 400
2    S 250
3    S 300

我需要什么:

ID   Description_1   Description_2   Description_3   Description_4
------------------------------------------------------------------
1    S 400           M 200           HPS 1000        S 400
2    M 400           S 250
3    S 300

描述在描述列中的填充顺序并不重要,例如对于 ID = 1,HPS 1000 值可能位于描述列 1、2、3 或 4 中。因此,只要所有值都存在。

我试图调整它,但我认为这不是正确的工具。

select * from table t
pivot (
max(Description) for ID in (1, 2, 3))

因为有大约 3000 个 ID,我最终会得到一个大约 3001 行宽的表格...

我也看了这个Oracle SQL Cross Tab Query 但是情况不太一样。

解决这个问题的正确方法是什么?

【问题讨论】:

  • 你知道要生成的最大列数吗?
  • 为什么 s 400 重复了两次?如果相同的描述重复 100 次会发生什么?
  • @Sam 你可以在一根灯杆上安装许多相同类型的路灯。路灯有26种。因此,值会经常重复。
  • @GordonLinoff 这将是 ID 加上 4 个可能的描述,所以总共 5 个。

标签: sql database oracle select pivot


【解决方案1】:

您可以使用row_number() 和条件聚合:

select 
    id,
    max(case when rn = 1 then description end) description_1,
    max(case when rn = 2 then description end) description_2,
    max(case when rn = 3 then description end) description_3,
    max(case when rn = 4 then description end) description_4
from (
    select t.*, row_number() over(partition by id order by description) rn
    from mytable t
) t
group by id

每个id 最多可处理 4 个描述。要处理更多问题,您可以使用更多条件 max()s 扩展 select 子句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2021-07-04
    • 2022-08-24
    • 2015-11-26
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多