如何使用“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
clickhouse实践clickhouse中如何实现ROW_NUMBER() OVER(PARTITION BY ‘xxx‘ ORDER BY ‘xxx‘ DESC/ASC)