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查询来完成?
答案 0 :(得分:2)
这是对window functions:
的可爱用法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
,如果所有send
值都为1,则此值只能为1.如果只有一行有0,那么这将是该分区的最小值。
答案 1 :(得分: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)