问题描述
我有一张桌子Accounts
AMOUNT| ID_CLIENT | ID_BRANCH
250 1 1
250 1 3
100 1 4
300 2 1
300 2 3
450 3 2
100 3 2
225 4 1
225 4 2
225 4 4
225 4 5
我需要找到每个分支中具有相同金额的客户(例如ID_CLIENT = 2和ID_CLIENT = 4)。我不知道该如何实施(有人可以帮我吗?
解决方法
使用两种聚合级别:
select client
from (select client,branch,sum(amount) as amount
from t
group by client,branch
) cb
group by client
having min(amount) = max(amount);
我无法确定每个客户/分支机构是否可以有多行。如果没有,您只需要:
select client
from t
group by client
having min(amount) = max(amount);
,
您可以使用分析函数来实现相同功能:
with CTE1 as
(
SELECT A.*,DENSE_RANK() OVER (PARTITION BY ID_CLIENT ORDER BY AMOUNT) DN,COUNT(*) OVER (PARTITION BY ID_CLIENT) TOTAL_COUNT
FROM TABLE1 A ORDER BY ID_CLIENT
)
SELECT ID_CLIENT FROM
(
SELECT ID_CLIENT,SUM(DN),TOTAL_COUNT
FROM CTE1
GROUP BY ID_CLIENT,TOTAL_COUNT
HAVING SUM(DN) = TOTAL_COUNT
);
使用First_value和Last_value:
SELECT DISTINCT ID_CLIENT FROM
(
SELECT A.*,FIRST_VALUE(AMOUNT) OVER(PARTITION BY ID_CLIENT ORDER BY AMOUNT ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FST_VAL,LAST_VALUE(AMOUNT) OVER(PARTITION BY ID_CLIENT ORDER BY AMOUNT ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) LST_VAL
FROM TABLE1 A
) X WHERE FST_VAL = LST_VAL ;