首页 > 解决方案 > SQL 分组列

问题描述

我从表中选择(id、group、type、created)。如何仅在第一次遇到“广告”类型(包括“广告”行)之前选择行。在此示例中,我需要 id 为 8207 - 8214 的行。

  id   | group | type | created_at |
+------+-------+------+------------+
| 8214 |    83 | msg  | 1571726466 |
| 8213 |    83 | msg  | 1571724983 |
| 8212 |    83 | msg  | 1571724982 |
| 8211 |    83 | msg  | 1571724978 |
| 8210 |    83 | msg  | 1570861659 |
| 8209 |    83 | msg  | 1570861656 |
| 8208 |    83 | msg  | 1570861650 |
| 8207 |    83 | ad   | 1570861643 |
| 8206 |    83 | msg  | 1570861632 |
| 8205 |    83 | msg  | 1570861623 |
| 8202 |    83 | msg  | 1570861617 |
| 8203 |    83 | msg  | 1570861617 |
| 8204 |    83 | msg  | 1570861617 |
| 8200 |    83 | msg  | 1570861616 |
| 8201 |    83 | msg  | 1570861616 |
| 8197 |    83 | msg  | 1570861615 |
| 8198 |    83 | msg  | 1570861615 |
| 8199 |    83 | msg  | 1570861615 |
| 8194 |    83 | msg  | 1570861614 |
| 8195 |    83 | ad   | 1570861614 |
| 8196 |    83 | msg  | 1570861614 |
| 8192 |    83 | msg  | 1570861613 |

预期的:

+------+-------+------+------------+
| id   | group | type | created_at |
+------+-------+------+------------+
| 8214 |    83 | msg  | 1571726466 |
| 8213 |    83 | msg  | 1571724983 |
| 8212 |    83 | msg  | 1571724982 |
| 8211 |    83 | msg  | 1571724978 |
| 8210 |    83 | msg  | 1570861659 |
| 8209 |    83 | msg  | 1570861656 |
| 8208 |    83 | msg  | 1570861650 |
| 8207 |    83 | ad   | 1570861643 |

UPD:基本上我需要我选择的行的切片,上面有一个行广告。

标签: mysqlsqlgrouping

解决方案


我猜:

select *
from t
where created_at >= (select max(created_at) from t where type = 'ad')

但是,您没有指定仅在第一次遇到“广告”类型之前意味着什么 - 表格是按 ? 排序的created_at?或者id?会出现重复created_at值吗?


推荐阅读