我一直坚持表达,因为我甚至没想到如何做到这一点:
示例表(忽略rotid,不使用)
id ------ trackid -----rotid-----userid-----actid
1159 ------ 108980421888 ------ 48 ------ 1 ------ 21
1160 ------ 108980421888 ------ 48 ------ 917 ------ 2
1161 ------ 108980421888 ------ 48 ------ 918 ------ 3 - in result
1162 ------ 108980421888 ------ 48 ------ 919 ------ 4
1163 ------ 108980421888 ------ 48 ------ 920 ------ 5
1164 ------ 108980421888 ------ 48 ------ 921 ------ 4
1165 ------ 108980421888 ------ 48 ------ 922 ------ 6
1166 ------ 108980421888 ------ 48 ------ 917 ------ 4
1167 ------ 108980421888 ------ 48 ------ 918 ------ 6
1168 ------ 108980421888 ------ 48 ------ 1 ------ 7
1169 ------ 108980421888 ------ 48 ------ 918 ------ 8
1170 ------ 108980421888 ------ 48 ------ 920 ------ 5
1171 ------ 108980421888 ------ 48 ------ 922 ------ 4
1172 ------ 108980421888 ------ 48 ------ 918 ------ 5
1173 ------ 108980421888 ------ 48 ------ 920 ------ 6
1174 ------ 108980421888 ------ 48 ------ 1 ------ 9
1175 ------ 108980421888 ------ 48 ------ 1 ------ 19
1176 ------ 108980421888 ------ 48 ------ 918 ------ 12
1177 ------ 108980421888 ------ 48 ------ 920 ------ 12
1178 ------ 108980421888 ------ 48 ------ 1 ------ 15
我需要选择所有行:trackid = trackid,在actid = 21之后和FIRST actid = 5之前。 ACTID = 3。带有idiential trackid的行数据包汇集在一起。 Actid = 21始终是行数据包中的第一个。 Actid = 5总是以行包形式出现。有时它可能是第一行actid = 21和第二行actid = 5。我们不知道确切的trackid(trackid =?)。
换句话说:我们需要选择actid = 3的所有行,但是在actid = 21之后和actid = 5之前,使用相同的trackid选择。
第二个查询是相同的,但我们知道确切的用户ID。
感谢您提前!
答案 0 :(得分:1)
对于您问题中的数据:
select t.*
from table t join
(select trackid, min(case when actid = 21 then id end) as id21,
min(case when actid = 5 then id end) as id5
from table t
group by trackid
) tlim
on t.id > tlim.id21 and t.id < tlim.id5
order by id;
这会找到trackid
为21和5的每个actid
的最小ID,并选择中间的行。