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