Oracle Sql根据另一个表中的重复项计算表中的行数

Oracle Sql根据另一个表中的重复项计算表中的行数,sql,oracle,Sql,Oracle,我在OracleSQLDeveloper中有两个表,它们由键ID+状态连接。第一个t1有4列: ID measurement Value state 123 Nitrogen .7 VA 123 Oxygen .1 VA 456 Nitrogen .6 MI 456 Carbon .5 MI 456 Oxygen .3 MI 第二个表t2有3列:

我在OracleSQLDeveloper中有两个表,它们由键ID+状态连接。第一个t1有4列:

ID    measurement   Value   state
123   Nitrogen      .7      VA
123   Oxygen        .1      VA 
456   Nitrogen      .6      MI 
456   Carbon        .5      MI
456   Oxygen        .3      MI
第二个表t2有3列:

ID    date      state
123   5/20/20   VA
123   8/3/16    VA
我需要编写一个查询,首先在t2中搜索重复的ID+状态,然后在第二个表中搜索少于三行的重复ID+状态的实例。返回的是t2中重复的ID的计数,对于t2中的每个状态,t1中的ID数少于三行。 在本例中:

VA - 1
MI - 0 
在Oracle中有没有一种简单的方法可以做到这一点? 我已经尝试了以下SQL的迭代,但很难找到正确的语法,我想知道是否有更好的方法。我尝试了以下查询的多次迭代:

select a.ID, a.state count() totalcount from t2 A left join t1 B on a.ID=b.ID and a.state=b.state where b.ID having count < 3 group by a.id having count () >1 

谢谢大家!

根据您的条件在eah表中单独聚合,然后根据不同ID的数量加入聚合:

select t1.state, count(distinct t2.id) counter
from (
  select id, state from t1
  group by id, state
  having count(*) > 1
) t1 left join (
  select id, state from t2
  group by id, state
  having count(*) < 3
) t2
on t2.id = t1.id and t2.state = t1.state
group by t1.state
看。 结果:


谢谢你的反馈。我正在使用模式中的表,所以我不确定我的语法是否正确。我继续在schema.t1 left join中得到一个语法错误,它表示where_子句和unbalanced_nonblock_stmt。下面是我的查询:选择A.state,countdistinct B.ID counter from select ID,state from schema.t1 group by ID,state have count>1 schema.t1 left join select ID,state from schema.t2 group by ID,state have count<3 schema.t2 B on A.ID=B.ID和A.state=B.state group by A.state更改为:选择A.state,countdistinct B.ID计数器与select ID、state from schema.t1 group by ID、state from count*>1A left join select ID、state from schema.t2 group by ID、state from count*<3BON A.ID=B.ID和A.state=B.state group by A.state
select t1."state", count(distinct t2.id) counter
from (
  select id, "state", 
         count(*) over (partition by id, "state") counter1
  from t1
) t1 left join (
  select id, "state", 
         count(*) over (partition by id, "state") counter2
  from t2
) t2
on t2.id = t1.id and t2."state" = t1."state"
and t1.counter1 > 1 and t2.counter2 < 3
group by t1."state"
> state | COUNTER
> :---- | ------:
> VA    |       1
> MI    |       0