Sql 基于单列返回不同记录的问题(Oracle)

Sql 基于单列返回不同记录的问题(Oracle),sql,oracle,Sql,Oracle,如果我有表“members”(如下所示),我将如何获取成员身份(Oracle)第一次出现的记录 预期结果 123 John Doe A P 313 Michael Casey A A 113 Luke

如果我有表“members”(如下所示),我将如何获取成员身份(Oracle)第一次出现的记录

预期结果

123                 John                      Doe                      A       P
313                 Michael                   Casey                    A       A
113                 Luke                      Skywalker                A       P
membership_id       first_name                last_name                status  type
123                 John                      Doe                      A       P
313                 Michael                   Casey                    A       A
113                 Luke                      Skywalker                A       P
123                 Bob                       Dole                     A       A
313                 Lucas                     Smith                    A       A
表格-成员

123                 John                      Doe                      A       P
313                 Michael                   Casey                    A       A
113                 Luke                      Skywalker                A       P
membership_id       first_name                last_name                status  type
123                 John                      Doe                      A       P
313                 Michael                   Casey                    A       A
113                 Luke                      Skywalker                A       P
123                 Bob                       Dole                     A       A
313                 Lucas                     Smith                    A       A
希望有帮助

SELECT membership_id,
       first_name,
       last_name,
       status,
       type
  FROM( SELECT membership_id,
               first_name,
               last_name,
               status,
               type,
               rank() over (partition by membership_id
                                order by type desc) rnk
          FROM members )
 WHERE rnk = 1
希望有帮助

SELECT membership_id,
       first_name,
       last_name,
       status,
       type
  FROM( SELECT membership_id,
               first_name,
               last_name,
               status,
               type,
               rank() over (partition by membership_id
                                order by type desc) rnk
          FROM members )
 WHERE rnk = 1
将适用于您的示例数据集。如果您可以有关系,即多行具有相同的
成员身份\u id
和相同的最大
类型
,则此查询将返回所有这些行。如果您只想返回有平局的行中的一行,则需要向顺序添加额外的条件,以确保所有平局均已中断,或者需要使用行号功能,而不是将任意中断平局的排名

select *
from members 
where rowid in (
    select min(rowid)
    from members
    group by membership_id
)

将适用于您的示例数据集。如果您可以有关系,即多行具有相同的
成员身份\u id
和相同的最大
类型
,则此查询将返回所有这些行。如果只想返回有平局的一行,您可能需要向“排序依据”添加额外的条件,以确保所有的关联都已断开,或者您需要使用
行数
函数,而不是将任意断开关联的

由于表中的行本质上是无序的,那么确定“优先”的逻辑是什么?为了确定“第一”行,我们可以按什么列排序?在您的示例中,看起来我们可以按
姓氏
订购,但我不确定这通常是否正确。订购顺序是根据会员身份id和“类型”(desc)确定的。我的例子显然是按这个顺序排列的,但这并不能消除我所面临的问题。我的程序中的数据实际上不是一个表,而是一个已经存在的查询的结果。既然表中的行本质上是无序的,那么确定“优先”的逻辑是什么?为了确定“第一”行,我们可以按什么列排序?在您的示例中,看起来我们可以按
姓氏
订购,但我不确定这通常是否正确。订购顺序是根据会员身份id和“类型”(desc)确定的。我的例子显然是按这个顺序排列的,但这并不能消除我所面临的问题。我的程序中的数据实际上不是表,而是已有查询的结果。
首先
?据我所知,这不是一个Oracle函数。你是说
max
还是
min
,它会选择任意组合(可能不是OP想要的?是的,你说的对,我没有Oracle方面的经验,所以我只是想指出一条可能的路径。关于max/min,问题是“获取成员id(Oracle)首次出现的记录”因此,我认为获得第一次出现是目标,但我可能误解了。
第一次
?据我所知,这不是Oracle函数。您是指将选择任意组合的
max
还是
min
(可能不是OP想要的?是的,你说的对,我没有Oracle方面的经验,所以我只是想指出一条可能的路径。关于最大/最小值,问题是“获取成员id(Oracle)首次出现的记录”,所以我假设获得第一次出现是目标,但我可能误解了。
select *
from members 
where rowid in (
    select min(rowid)
    from members
    group by membership_id
)