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

How to get distinct using `OVER(PARTITION BY ...)`

如何使用 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   |

这是你想要的吗?

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 子句中使用 window 函数 - 您需要在子查询中计算 window 计数,然后在外部查询。

或者,如果您只想使用 window 函数生成与第一个查询相同的结果,那么您可能正在寻找 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

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

这是使用 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