Closed. This question needs details or clarity。它目前不接受答案。
想改进这个问题吗?添加细节并通过editing this post澄清问题。
5年前关闭。
我在表达上有点吃力,因为我甚至不知道该怎么做:
示例表(忽略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之后,在第一个actid=5之前。激活=3。具有idential trackid的行的数据包聚集在一起。Actid=21总是第一行数据包。Actid=5总是以行数据包的形式出现。有时可能是第一行actid=21,第二行actid=5。我们不知道确切的trackid(trackid=?).
换句话说:我们需要选择actid=3的所有行,但是ony after actid=21 and before actid=5,使用相同的trackid。
第二个查询是相同的,但是我们知道确切的用户id。
谢谢你的提前!

最佳答案

对于您所问的数据:

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的最小id,其中actid是21和5,并选择其中的行。

10-02 05:24