3

我有一张桌子;让它被称为table1;具有以下字段和数据

msgid  msisdn teaserid send
1      333     1        1
2      333     1        0
3      444     2        1
4      444     2        1
5      444     3        1

我需要一个查询,它返回那些 msgid,对于具有相同 msisdn、teaserid 的每条记录,send = 1。在上述情况下,我想要 msgid: 3,4,5 作为结果。如何使用 mssql 查询来做到这一点?

4

2 回答 2

2

这是窗口函数的一个可爱用法:

declare @t table (msgid int,msisdn int,teaserid int,send int)
insert into @t (msgid,msisdn,teaserid,send) values
(1,333,1,1),
(2,333,1,0),
(3,444,2,1),
(4,444,2,1),
(5,444,3,1)

select * from (
select *,MIN(send) OVER (PARTITION BY msisdn,teaserid) as all1
from @t
)t
where all1 = 1

结果:

msgid       msisdn      teaserid    send        all1
----------- ----------- ----------- ----------- -----------
3           444         2           1           1
4           444         2           1           1
5           444         3           1           1

通过MIN(send)msisdn,teaserid分区计算,如果所有值都是 1,则这只能send是 1。如果只有一行有 0,那将是该分区的最小值。

于 2013-01-25T07:14:53.927 回答
1

您可以使用此查询来获取结果

 select msgid 
 from table1 t 
 where send=1 
       and exists(select * from table
                  where send=1 
                  and msisdn=t.msisdn
                  and teaserid=t.teaserid and msgid != t.msgid)
于 2013-01-25T06:59:40.980 回答