如何根据条件对不同行中的相同值进行 GROUP BY? (MYSQL)
How to GROUP BY same value in different rows with condition? (MYSQL)
我有这个table:
+-----------+-----------+---------------------+
| id | member_id | date |
+-----------+-----------+---------------------+
| 1 | 2 | 2020-07-27 21:53:46 |
| 2 | 1 | 2020-07-27 22:03:58 |
| 3 | 1 | 2020-07-27 22:09:16 |
| 4 | 1 | 2020-07-27 22:11:33 |
| 5 | 2 | 2020-07-27 22:12:21 |
-----------------------------------------------
我想 GROUP BY
这样的事情:
+-----------+-----------+---------------------+
| id | member_id | date |
+-----------+-----------+---------------------+
| 1 | 2 | 2020-07-27 21:53:46 |
| 2 | 1 | 2020-07-27 22:03:58 |
| 5 | 2 | 2020-07-27 22:12:21 |
-----------------------------------------------
但是当我输入 GROUP BY member_id
它只是 return 我两行 (1, 2)
我将其理解为一个间隙和孤岛问题,您希望在其中显示 member_id
与“上一”行不同的行。
这是一种使用 window 函数的方法(在 MySQL 8.0 中可用):lag()
给出前一行的 member_id
,然后我们可以将其与当前行的值:
select id, member_id, date
from (
select t.*, lag(member_id) over(order by date) lag_member_id
from mytable t
) t
where not lag_member_id <=> member_id
order by date
id | member_id | date
-: | --------: | :------------------
1 | 2 | 2020-07-27 21:53:46
2 | 1 | 2020-07-27 22:03:58
5 | 2 | 2020-07-27 22:12:21
我有这个table:
+-----------+-----------+---------------------+
| id | member_id | date |
+-----------+-----------+---------------------+
| 1 | 2 | 2020-07-27 21:53:46 |
| 2 | 1 | 2020-07-27 22:03:58 |
| 3 | 1 | 2020-07-27 22:09:16 |
| 4 | 1 | 2020-07-27 22:11:33 |
| 5 | 2 | 2020-07-27 22:12:21 |
-----------------------------------------------
我想 GROUP BY
这样的事情:
+-----------+-----------+---------------------+
| id | member_id | date |
+-----------+-----------+---------------------+
| 1 | 2 | 2020-07-27 21:53:46 |
| 2 | 1 | 2020-07-27 22:03:58 |
| 5 | 2 | 2020-07-27 22:12:21 |
-----------------------------------------------
但是当我输入 GROUP BY member_id
它只是 return 我两行 (1, 2)
我将其理解为一个间隙和孤岛问题,您希望在其中显示 member_id
与“上一”行不同的行。
这是一种使用 window 函数的方法(在 MySQL 8.0 中可用):lag()
给出前一行的 member_id
,然后我们可以将其与当前行的值:
select id, member_id, date
from (
select t.*, lag(member_id) over(order by date) lag_member_id
from mytable t
) t
where not lag_member_id <=> member_id
order by date
id | member_id | date -: | --------: | :------------------ 1 | 2 | 2020-07-27 21:53:46 2 | 1 | 2020-07-27 22:03:58 5 | 2 | 2020-07-27 22:12:21