【问题标题】:Select 3 columns as distinct from 5 selected columns in Oracle选择 3 列与 Oracle 中的 5 个选定列不同
【发布时间】:2016-11-26 04:26:06
【问题描述】:

输入表格数据:

|Col1  |Col2    |Col3   |Col4   |Col5
|----  | ---    |---    |---    |---
|AA    | 11     |9009   |1      |1
|AA    | 11     |9009   |2      |2
|BB    | 22     |8888   |1      |1
|CC    | 33     |7777   |1      |1
|CC    | 33     |7777   |2      |2
|DD    | 44     |6666   |1      |1
|EE    | 55     |5555   |1      |1
|EE    | 55     |5555   |2      |2

这应该保存到目标表中,如下所示,因为 col1、col2、col3 是使用复合主键定义的:

Col1   |Col2   |Col3   |Col4  |Col5
-----------------------------------
AA     |11     |9009   |1     | 1
BB     |22     |8888   |1     | 1
CC     |33     |7777   |2     | 2
DD     |44     |6666   |1     | 1
EE     |55     |5555   |2     | 2

如何在前 3 列上使用 distinct,但选择所有 5 列?

我已经看到了选择一个不同列的其他示例。有人可以帮忙看看这个例子吗?

【问题讨论】:

  • 您想要“其他”两列的哪个值?关系表中的行没有定义的顺序,如果没有ORDER BY 子句,数据库可以选择以它关心的任何顺序返回行。
  • 任何一行都适用于其他 2 列

标签: oracle


【解决方案1】:

一种方法是对前三列的每个组合的行进行排序 - 这是分析函数的工作,特别是在这种情况下 row_number()。然后只需从每个“组”(或分析函数术语中的“分区”)中选择“第一行”。类似的东西

select col1, col2, col3, col4, col5
from   ( select col1, col2, col3, col4, col5,
                row_number() over (partition by col1, col2, col3 order by null) as rn
         from   input_table
       )
where  rn = 1
;

order by null 的意思是“按你想要的顺序排序,我不在乎,只需对每个分区中的行进行排序。”

【讨论】:

    【解决方案2】:

    另一个变体是使用 GROUP BY,并在辅助列上聚合函数。例如:

    select col1, col2, col3, max(col4) as column4, min(col5) as column5
    from input_table  
    group by col1, col2, col3;
    

    【讨论】:

    • 这可能会从输入数据的不同 ROWS 中选择 max(col4) 和 min(col5)。 OP 似乎想从输入中按原样选择一行(任何行)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2015-01-11
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多