如何找到等值的行?

问题描述

我有一张桌子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);
,

您可以使用分析函数来实现相同功能:

Demo

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:

Demo

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 ;