我应该使用哪个 Oracle 分析函数来获得此结果?

发布于 2025-01-10 07:12:52 字数 847 浏览 3 评论 0原文

可能是个愚蠢的问题,但今天是周日,我的思维无法正常运转。我正在尝试使用分析函数来获取以下结果

我有这个查询(这只是一个记录的一个小例子,但足以解释我想要解释的内容)

   select h.party_number,organization_name,address_line1,address_type 
      ,row_number() over(partition by party_number,organization_name,address_line1 order by address_line1,address_type ) as newrn
from h 
where party_number = 'FI-110584'
order by address_type,party_number;

这给了我这个结果

在此处输入图像描述

什么我真正想要的是party_number、organization_name 和 adress_line1 的组合具有相同的排名(因此具有相同的数字)

因此,最后一列应类似于

1

1

2

因为相同的 party_number、organization_name 和 address_line 应具有相同的排名值。

我应该在这里使用什么分析函数?我尝试了 dense_rankrank 但没有成功。

谢谢大家

Probably a dummy question, but it is Sunday and my mind does not work as it should be. I am trying to use an analytic function to get the following

I have this query ( it is just a small example of one record but enough for what I am trying to explain )

   select h.party_number,organization_name,address_line1,address_type 
      ,row_number() over(partition by party_number,organization_name,address_line1 order by address_line1,address_type ) as newrn
from h 
where party_number = 'FI-110584'
order by address_type,party_number;

Which gives me this result

enter image description here

What I really want is to have the same ranking ( so the same number ) for the combination of party_number, organization_name and adress_line1

So, the last column should look like

1

1

2

Because the same party_number, organization_name and address_line should be given the same ranking value.

What analytic function should I use here ? I tried dense_rank and rank with no success.

Thank you all

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦太阳 2025-01-17 07:12:52

对我来说,它看起来像是您正在寻找的 DENSE_RANK without ADDR 列:

SQL> with test (party, org, addr) as
  2    (select 'fi-11', 'neka', 'golfe 4' from dual union all
  3     select 'fi-11', 'neka', 'golfe 4' from dual union all
  4     select 'fi-11', 'neka', 'pl 100'  from dual
  5    )
  6  select t.*,
  7    dense_rank() over (partition by party, org order by addr) rnk
  8  from test t
  9  order by addr;

PARTY ORG  ADDR           RNK
----- ---- ------- ----------
fi-11 neka golfe 4          1
fi-11 neka golfe 4          1
fi-11 neka pl 100           2

SQL>

To me, it looks like it is DENSE_RANK without ADDR column you're looking for:

SQL> with test (party, org, addr) as
  2    (select 'fi-11', 'neka', 'golfe 4' from dual union all
  3     select 'fi-11', 'neka', 'golfe 4' from dual union all
  4     select 'fi-11', 'neka', 'pl 100'  from dual
  5    )
  6  select t.*,
  7    dense_rank() over (partition by party, org order by addr) rnk
  8  from test t
  9  order by addr;

PARTY ORG  ADDR           RNK
----- ---- ------- ----------
fi-11 neka golfe 4          1
fi-11 neka golfe 4          1
fi-11 neka pl 100           2

SQL>
丶情人眼里出诗心の 2025-01-17 07:12:52

您的分区和排序有点不对:

select h.party_number,organization_name,address_line1,address_type 
      ,dense_rank() over(partition by party_number,organization_name order by address_line1 ) as newrn
from h 
where party_number = 'FI-110584'
order by address_type,party_number;
PARTY_NUMBERORGANIZATION_NAMEADDRESS_LINE1ADDRESS_TYPENEWRN
FI-110584NEKAPAINO OYGOLFKENTÄNTIE 4Default1
FI-110584NEKAPAINO OYGOLFKENTÄNTIE 4DivAdd1
FI-110584NEKAPAINO OYPL 100InvAdd2

db>>fiddle

Your partitioning and ordering is a little off:

select h.party_number,organization_name,address_line1,address_type 
      ,dense_rank() over(partition by party_number,organization_name order by address_line1 ) as newrn
from h 
where party_number = 'FI-110584'
order by address_type,party_number;
PARTY_NUMBERORGANIZATION_NAMEADDRESS_LINE1ADDRESS_TYPENEWRN
FI-110584NEKAPAINO OYGOLFKENTÄNTIE 4Default1
FI-110584NEKAPAINO OYGOLFKENTÄNTIE 4DivAdd1
FI-110584NEKAPAINO OYPL 100InvAdd2

db<>fiddle

肤浅与狂妄 2025-01-17 07:12:52

您需要的是 DENSE_RANK,而不是 ROW_NUMBER -

SELECT h.party_number,
       organization_name,
       address_line1,
       address_type,
       DENSE_RANK() OVER(PARTITION BY party_number,organization_name,address_line1 ORDER BY address_type) as newrn
  FROM h 
 WHERE party_number = 'FI-110584'
 ORDER BY address_type, party_number;

You need a DENSE_RANK not ROW_NUMBER -

SELECT h.party_number,
       organization_name,
       address_line1,
       address_type,
       DENSE_RANK() OVER(PARTITION BY party_number,organization_name,address_line1 ORDER BY address_type) as newrn
  FROM h 
 WHERE party_number = 'FI-110584'
 ORDER BY address_type, party_number;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文