1

在表中,我需要过滤掉最近的重复行,这些行在相同时具有相同status_id(但不是全部)user_idGROUP BY或者DISTINCT在这种情况下没有帮助。这是一个例子:

---------------------------------------------------
| id  |  user_id | status_id | date               |
---------------------------------------------------
|  1  |    10    |    1      | 2010-10-10 10:00:10|
|  2  |    10    |    1      | 2010-10-11 10:00:10|
|  3  |    10    |    1      | 2010-10-12 10:00:10|
|  4  |    10    |    2      | 2010-10-13 10:00:10|
|  5  |    10    |    4      | 2010-10-14 10:00:10|
|  6  |    10    |    4      | 2010-10-15 10:00:10|
|  7  |    10    |    2      | 2010-10-16 10:00:10|
|  8  |    10    |    2      | 2010-10-17 10:00:10|
|  9  |    10    |    1      | 2010-10-18 10:00:10|
|  10 |    10    |    1      | 2010-10-19 10:00:10|

必须看起来像:

---------------------------------------------------
| id  |  user_id | status_id | date               |
---------------------------------------------------
|  1  |    10    |    1      | 2010-10-10 10:00:10|
|  4  |    10    |    2      | 2010-10-13 10:00:10|
|  5  |    10    |    4      | 2010-10-14 10:00:10|
|  7  |    10    |    2      | 2010-10-16 10:00:10|
|  9  |    10    |    1      | 2010-10-18 10:00:10|

最早的条目(按日期)应保留在表中

4

1 回答 1

2

您希望根据idordate列保留先前状态不同的每一行。

如果您的 id 确实是连续的(因为它们在问题中),您可以通过方便的连接来做到这一点:

select t.*
from t left outer join
     t tprev
     on t.id = tprev.id+1
where tprev.id is null or tprev.status <> t.status;

如果 id 不是连续的,您可以使用相关子查询获取前一个:

select t.*
from (select t.*,
             (select t2.status
              from t t2
              where t2.user_id = t.user_id and
                    t2.id < t.id
              order by t2.id desc
              limit 1
             ) as prevstatus
      from t
     ) t
where prevstatus is null or prevstatus <> t.status;
于 2013-07-25T10:51:15.920 回答