hive 在一个SELECT语句中有两个相关的集合函数,这可能吗?

btxsgosb  于 2022-11-05  发布在  Hive
关注(0)|答案(2)|浏览(140)

让我先给你看一个简单的表格:
| 因|交易方标识|版本|
| - -|- -|- -|
| 第00020222号|第00020107号|第0001页|
| 第00006692号|第00006693号|小行星0025|
| 小行星00021768|第00006693号|小行星0006|
| 小行星00024726|第00006693号|第0001页|
| 小行星00024727|第00006693号|千|
| 第00006691号|第00006692号|小行星0018|
| 00021949年|第00006692号|千|
| 小行星00024728|第00006692号|千|
| 小行星00024928|第00006692号|千|
| 第00013670号|00013671号|千|
| 小行星00027865| 00013671号|千|
| 小行星00029716| 00013671号|0001|
|00029732|00013671|0001|
| 小行星00029749| 00013671号|千|
查看值“00006693”。我必须从ver列中获取最大值:在本例中,这将是'0025'。但是,如果列中的所有值都相同,则我必须从inr列中获取最大值。在本例中,这将是'00024727'。最终结果应如下所示:
| 因|交易方标识|版本|
| - -|- -|- -|
| 第00020222号|第00020107号|第0001页|
| 第00006692号|第00006693号|小行星0025|
| 第00006691号|第00006692号|小行星0018|
| 小行星00029732|00013671| 第0001页|
我的问题是,如何通过使用两个max()函数来获得这些数据?我不擅长分析问题。
我还将添加一个图像,其中描述了问题(我认为)更好,请根据它:

pcww981p

pcww981p1#

我可以提供两种选择。简单的解决方案-只需在party_id组中按“ver desc,inr desc”排序:

with test_data as (
  select '00020222' inr,    '00020107' party_id,    '0001' ver union
  select '00006692',    '00006693', '0025' union
  select '00021768',    '00006693', '0006' union
  select '00024726',    '00006693', '0001' union
  select '00024727',    '00006693', '0000' union
  select '00006691',    '00006692', '0018' union
  select '00021949',    '00006692', '0000' union
  select '00024728',    '00006692', '0000' union
  select '00034567',    '00019734', '0022' union
  select '00064657',    '00019734', '0022'
)
select
  r.inr, r.party_id, r.ver
from 
(  
  select 
    t.*, 
    row_number() over(partition by t.party_id order by t.ver desc, t.inr desc) rn
  from
    test_data t
) r
where
  r.rn = 1

第二个解决方案更详细,但直接实现您的逻辑:

with test_data as (
  select '00020222' inr,    '00020107' party_id,    '0001' ver union
  select '00006692',    '00006693', '0025' union
  select '00021768',    '00006693', '0006' union
  select '00024726',    '00006693', '0001' union
  select '00024727',    '00006693', '0000' union
  select '00006691',    '00006692', '0018' union
  select '00021949',    '00006692', '0000' union
  select '00024728',    '00006692', '0000' union
  select '00034567',    '00019734', '0022' union
  select '00064657',    '00019734', '0022'
)
select 
  r.inr, r.party_id, r.ver
from
(  
  select 
    t.*,
    case when count(distinct t.ver) over(partition by t.party_id) == 1 then 1 else 0 end is_all_ver_same,
    row_number() over(partition by t.party_id order by t.ver desc) max_ver,
    row_number() over(partition by t.party_id order by t.inr desc) max_inr
  from 
    test_data t
) r   
where 
  (r.is_all_ver_same = 1 and r.max_inr = 1) or (r.is_all_ver_same = 0 and r.max_ver = 1)
dfddblmv

dfddblmv2#

我认为在一个select语句中是不可行的,因为窗口函数有其局限性,但是您需要的可以通过包含用于排序的**ROW_NUMBER()**函数的子查询来解决:

if object_id(N'tempdb..#Temp') is not null 
drop table #Temp
create table #Temp (
    inr int null,
    party_id int null,
    ver int null
)
insert into #Temp
    (
        inr,
        party_id,
        ver
    )
values
    (00020222,  00020107,   0001),
    (00006692,  00006693,   0025),
    (00021768,  00006693,   0006),
    (00024726,  00006693,   0001),
    (00024727,  00006693,   0000),
    (00006691,  00006692,   0018),
    (00021949,  00006692,   0000),
    (00024728,  00006692,   0000),
    (00024928,  00006692,   0000),
    (00013670,  00013671,   0000),
    (00027865,  00013671,   0000),
    (00029716,  00013671,   0001),
    (00029732,  00013671,   0001),
    (00029749,  00013671,   0000)

select 
    inr,
    party_id,
    ver
from
    (
        select
            row_number() over (partition by party_id order by ver desc, inr desc) as rn,
            *
        from #Temp
    ) a
where rn = 1

相关问题