如何使用“OVER(PARTITION BY ...)”来区分[关闭]

Posted

技术标签:

【中文标题】如何使用“OVER(PARTITION BY ...)”来区分[关闭]【英文标题】:How to get distinct using `OVER(PARTITION BY ...)` [closed] 【发布时间】:2020-11-18 00:47:10 【问题描述】:

如何使用OVER(PARTITION BY ...) 区分?

SELECT ACCT_TYPE_CD AS entity,
         ACCT_ID AS entity_VAL,
         COUNT (1) AS CNT
    FROM ACCOUNT
GROUP BY ACCT_TYPE_CD, ACCT_ID
  HAVING COUNT (1) > 1;

entity      |entity_val      |cnt |
------------|----------------|----|
EMPID       |1               |3   |
EMPID       |1066            |3   |

我想使用下面的查询,所以我应该能够将它用作内部查询。

select  ACCT_TYPE_CD, ACCT_ID,  COUNT(*) OVER(PARTITION BY ACCT_TYPE_CD, ACCT_ID) AS CNT
from ACCOUNT ACCT; 

acct_type_cd |ACCT_ID     |cnt |
-------------|------------|----|
EMPID        |1           |3   |
EMPID        |1           |3   |
EMPID        |1           |3   |
EMPID        |1066        |3   |
EMPID        |1066        |3   |
EMPID        |1066        |3   |

【问题讨论】:

你能告诉我最终的查询是什么吗? 您的第二个查询看起来应该是一个简单的 GROUP BY 查询,如果您不想重复(并且您只选择这些列)。 @Marth - 我不确定你的意思,你能在查询中显示吗? 如果第一个查询符合您的要求,那么您为什么要另一个查询? 【参考方案1】:

这是你想要的吗?

select *
from (
    select  acct_type_cd, acct_id, count(*) over(partition by acct_type_cd, acct_id) as cnt
    from account acct
) t
where cnt > 1

也就是说:您不能在查询的where 子句中使用窗口函数 - 您需要在子查询中计算窗口计数,然后在外部查询中进行过滤。

或者,如果您想仅使用窗口函数生成与第一个查询相同的结果,那么您可能正在寻找row_number()

select *
from (
    select  
        acct_type_cd, 
        acct_id, 
        count(*) over(partition by acct_type_cd, acct_id) as cnt,
        row_number() over(partition by acct_type, acct_id order by acct_type, acct_id) rn
    from account acct
) t
where cnt > 1 and rn = 1

也就是说,我真的不知道你为什么要这样做;使用聚合(如在第一个查询中)可能总是比两个窗口函数和过滤(如在第二个查询中)更有效。

这是使用distinct on的最后一个选项:

select distinct on (acct_type_cd, acct_id)
    acct_type_cd, 
    acct_id, 
    count(*) over(partition by acct_type_cd, acct_id) as cnt
from account acct
order by acct_type_cd, acct_id

【讨论】:

不,这不是我想要的,我想要独特的记录。我也想要第二个查询的第一个查询的结果 @JeffCook:我不明白你的意思。请您编辑您的问题以显示您想要的结果吗? 请正确阅读。我想从第二个查询输出第一个查询 你的最后一个查询是有道理的,是的,让我试着看看在我想使用它的更大查询中使用它。

以上是关于如何使用“OVER(PARTITION BY ...)”来区分[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何对不同值求和 OVER (PARTITION BY DISTINCT)

Hive 问题 - Rank() OVER (PARTITION BY Dept ORDER BY sum(salary))

如何与“row_number() over (partition by [Col] order by [Col])”相反

使用 OVER (PARTITION BY ) 而不是 Group By

在 OVER(PARTITION BY) 中使用 CTE

clickhouse实践clickhouse中如何实现ROW_NUMBER() OVER(PARTITION BY ‘xxx‘ ORDER BY ‘xxx‘ DESC/ASC)