0

我有一个查询(实际上是一个视图),通常应该定义一个从keyto的唯一映射value2

select key, value1, value2
from tbl -- joins are left out here
where (1=1) -- left out here
order by key
;

通常结果是这样的

key       value1  value2
--------------------------
Harry     fish    blue
Sally     dog     green
Willy     dog     red

所以我可以唯一地映射keyvalue2

但是当它发生时,底层数据可能有一天会包含垃圾:

key       value1  value2
--------------------------
Harry     fish    blue
Harry     fish    black     -- <<< breaks uniqueness
Sally     dog     green
Willy     dog     red

我想添加HAVING和/或GROUP BY表达式来轻松识别非唯一行。因为在这种情况下我必须做一些事情,value2所以我必须以某种方式聚合它——我的想法是max

因此,一个示例结果将是

key       value1  value2   count_value2
----------------------------------------
Harry     fish    blue     2
Sally     dog     green    1
Willy     dog     red      1

但和往常一样,我完全被GROUP BY它的配偶弄糊涂了。我在哪里呢?聚集的地点和地点?

4

3 回答 3

1

像这样的东西?

select 
  key, 
  min(value1) as "a value1", 
  min(value2) as "a value2", 
  max(value2) as "another value2", 
  count(distinct value2) "number of value2"
FROM tbl
group by key
having count(distinct value2) > 1
于 2012-06-21T10:23:10.320 回答
1

更接近解决方案:

select tbl.*,count(distinct value2) over (partition by key) from tbl

或与一组

select key,count(distinct value2) from tbl group by key having count(distinct value2)>1
于 2012-06-21T10:23:39.817 回答
0

请试试这个,让我知道这就是你要找的

select C.key,C.value1,C.value2,A.count_value2 from
(select key,value1,COUNT(*) count_value2
from tbl
group by key,value1)A
join
(select B.key,B.value1,B.value2 from
(select *,ROW_NUMBER() over(partition by T.key,T.value1 order by T.key )  rn 
from tbl T 
group by T.key,T.value1,T.value2)B
where B.rn=1)C
on C.key=A.key
and C.value1=A.value1
于 2012-06-21T11:50:33.460 回答