-2

我想做这样的事情:

选择值 1、值 2、值 3、值 4、计数(1)
来自我的表
其中 value1、value2、value3、value4 在
    (从 mytable 中选择 value1、value2、value3、value4
     其中 record_no = 1 和 value5 = 'foobar')
按值1、值2、值3、值4分组
计数(1)> 4;

也就是说,我想为在至少一个记录上具有特定属性的所有 1-4 组找到值 1-4,并且我只想要具有四个以上记录的组。

更新澄清

从 mytable 中选择 *;

会给你类似的东西

value1 value2 value3 value4 record_no value5 更多列
------ ------ ------ ------ --------- ------ ------------ ------
aaa bbb ccc ddd 1 foobar
aaa bbb ccc ddd 2 abcdef
aaa bbb ccc ddd 3 zzzzzz
aaa bbb ccc ddd 4 barfoo
aaa bbb ccc ddd 5 dsnmatr
a1 b1 c1 d1 1 foobar
a1 b1 c1 d1 2 foobar
a2 b2 c2 d2 1 barfoo
a2 b2 c2 d2 2 巴富

我想找到 value1、value2、value3、value4 的值对于 value1、value2、value3、value4 的所有组,记录 1 具有 'foobar' 作为其 value5,并且组大小> 4。

例如它应该返回

值1 值2 值3 值4
------ ------ ------ ------  
aaa bbb ccc ddd
4

3 回答 3

2

你一开始就非常接近。这部分是问题:

where value1, value2, value3, value4 in

您必须将value1, value2, value3, value4其视为一个集合,因此只需像这样在它们周围加上括号:

where (value1, value2, value3, value4) in

这是整个查询;从您的帖子中唯一改变的是括号:

select value1, value2, value3, value4, count(1)
from mytable
where (value1, value2, value3, value4) in
    (select value1, value2, value3, value4
    from mytable
    where record_no = 1 and value5 = 'foobar')
group by value1, value2, value3, value4
having count(1) > 4;

这里有一个 SQL Fiddle 。

于 2013-04-13T04:18:27.157 回答
0

你可以这样做

select  value1, value2, value3, value4, count(*)
from    mytable
group by value1, value2, value3, value4
having  count(*) > 4 
and     sum(decode(record_no , 1 , 1 , 0)) = 1
and     sum(decode(value5 , 'foobar' , 1 , 0) = 1;

这是解码的一个小技巧。它应该可以正常工作。

出于教育目的,如果您不需要子查询中的实际数据(这是您的情况),最好始终使用EXISTS. 在你的例子中,它会是

select value1, value2, value3, value4, count(*)
from mytable
where exists 
    (select 1 
     from   mytable b
     where  b.record_no = 1 
     and    b.value5 = 'foobar'
     and    b.value1 = a.value1
     and    b.value2 = a.value2 
     and    b.value3 = a.value3
     and    b.value4 = a.value4
     )
group by value1, value2, value3, value4
having count(1) > 4;
于 2013-04-13T06:50:47.900 回答
0

当使用多个变量时,我经常将项目与一些不出现的字符连接在一起,所以

where value1 + '|' + value2 + '|' + value3 in (
    select value1 + '|' + value2 + '|' + value3 from ... 

如果我有三个字段。只有当所有的值都相同并达到结果时,平等才会成立。

于 2013-04-13T03:52:15.153 回答