我得到了下表player_teams,其中包含这样的数据
| id | p_id | year | t_id |
---------------------------
| 1 | 1 | 2001 | 1 |
| 2 | 1 | 2002 | 1 |
| 3 | 1 | 2003 | 1 |
| 4 | 1 | 2004 | 3 |
| 5 | 2 | 2001 | 1 |
| 6 | 2 | 2003 | 1 |
| 7 | 2 | 2004 | 2 |
| 8 | 2 | 2006 | 3 |
| 9 | 2 | 2007 | 1 |
现在我想删除t_id没有更改为year列中下一个较小条目的每个条目。 p_id当然必须是相同的。
所以在这个案例中,应删除id 2,3和6。
1:玩家的第一次进入(不要删除)
2:2001年没有变化(删除)
3:2002年没有变化(删除)
4:t_id改为2003年(不要删除)
5:玩家的第一次进入(不要删除)
6:没有变化到2001年(2002年缺失)(删除)
7:t_id改为2003年(不要删除)
8:t_id改为2004年(2005年缺席)(不要删除)
9:t_id改为2006年(不要删除)
请注意,所有列都可能会遗漏特定值,而不会对其进行排序。
目标只是改变球员所在队伍,而不是每年。
我不知道它是否可能与sql或我必须编写一个程序来执行它。
THX
答案 0 :(得分:3)
DELETE player_teams.*
FROM
player_teams LEFT JOIN (SELECT p_id, MIN(year) As min_year
FROM player_teams
GROUP BY p_id, t_id) p
ON player_teams.p_id = p.p_id AND player_teams.year=p.min_year
WHERE
p.p_id IS NULL
请参阅小提琴here。或者您可以使用它:
DELETE p1.*
FROM
player_teams p1 INNER JOIN player_teams p2
ON p1.p_id=p2.p_id
AND p1.t_id = p2.t_id
AND p1.year>p2.year
小提琴是here。
修改强>
如果您需要保留第9行,因为t_id更改为1,2,3然后更改回1,则需要使用更复杂的查询,如下所示:
DELETE
player_teams.*
FROM
player_teams INNER JOIN (
SELECT p1.p_id, p1.year, MAX(p2.year) prev_year
FROM
player_teams p1 LEFT JOIN player_teams p2
ON p1.p_id = p2.p_id AND p1.year>p2.year
GROUP BY
p1.p_id, p1.year) ny
ON player_teams.p_id = ny.p_id AND
player_teams.year = ny.year
INNER JOIN player_teams pny
ON ny.p_id = pny.p_id
AND ny.prev_year=pny.year
AND player_teams.t_id = pny.t_id
小提琴是here。
答案 1 :(得分:0)
试试这个,看它是否有效。
DELETE FROM Table
WHERE id IN (SELECT id FROM Table t1
WHERE t1.id > id AND t1.p_id = p_id AND t_id = t1.t_id)