如何根据选定的列而不是Oracle中表的所有列获取不同的行

Posted

技术标签:

【中文标题】如何根据选定的列而不是Oracle中表的所有列获取不同的行【英文标题】:How to get distinct rows based on selected columns instead of all columns of a table in Oracle 【发布时间】:2019-02-13 11:37:47 【问题描述】:

我正在尝试获取第一个不同的 3 列,而最后一列可以具有任何值。如果我在所有列上都不同,那么它会给我 8 行。该表是动态的,因此我需要不同的 3 列和最后一列中的任何值。

我有以下场景,

Name       Surname   Road           Pet
John       Trav     John_road       dog
Kaley      Couco    Couco_road     horse
Charlie    Sheen    Sheen_road     rabbit 
Johnny     Galecki  Galecki_road    cat 
John       Trav     John_road      donkie
Kaley      Couco    Couco_road      mouse
Charlie    Sheen    Sheen_road      goat
Johnny     Galecki  Galecki_road    pig

想要的结果:

Name       Surname   Road           Pet
John       Trav     John_road       dog
Kaley      Couco    Couco_road     mouse
Charlie    Sheen    Sheen_road     rabbit 
Johnny     Galecki  Galecki_road    cat 

我尝试了此链接上的解决方案,但它不起作用:

Oracle 11g SQL to get unique values in one column of a multi-column query

请在 Oracle 中提供帮助

【问题讨论】:

【参考方案1】:

由于您不关心最后一列的值,一个简单的选择是将其聚合为

select name, surname, road, max(pet) 
from your_table
group by name, surname, road

【讨论】:

【参考方案2】:

使用row_number()partition by 前三列:

dbfiddle demo

select * 
  from (
    select t.*, 
           row_number() over (partition by Name, Surname, Road order by pet) rn 
      from t)
  where rn = 1

【讨论】:

【参考方案3】:

你试过了吗

SELECT NAME, SURNAME, rOAD, PET FROM 
(
SELECT NAME, SURNAME, rOAD, PET, ROW_NUMBER () OVER (PARTITION BY NAME, SURNAME, rOAD ORDER BY PET) RN FROM FROM TABLE_NAME
) WHERE RN=1

【讨论】:

以上是关于如何根据选定的列而不是Oracle中表的所有列获取不同的行的主要内容,如果未能解决你的问题,请参考以下文章

如何从存储过程结果中检索特定列而不是所有列?

根据 SQL Server 2008R2 中表中的列获取计数

Django ORM:如何根据所有记录中的列获取唯一记录(需要模型对象而不是特定值对象)

如何使用 python 代码显示不相关的列而不绘图

Toad for Oracle - 从列选项卡中复制列而不包含所有详细信息

包含使用列而不是文本值或变量的全文索引