mysql - 对于 MySQL 中提到的示例,我应该使用循环还是任何其他替代方法
问题描述
我们目前有一个按 customer_id 分组的查询,一个客户可能有多个 booking_id,每个 booking_id 都有自己的跟踪器,可以是 Facebook 安装、Instagram 安装或有机我们需要创建一个新列作为预期输出,它检查是否对于客户的每次预订,所有跟踪器都是有机的,那么预期输出中的每一行对于该客户也是有机的。但是,如果预订的跟踪器包含 Facebook 安装或 Instagram 安装,并且之后的预订对于同一客户来说是有机的,如示例表 1 所示,那么预期输出应该是 Facebook 和 Instagram 安装的预订应该保持不变,但预订是有机的应该被分配它上面的预订跟踪器的名称,即 Instagram 安装,如示例表 1 所示。
没有程序的可能解决方案。
解决方案
使用合并和子查询来获取上一个或下一个非有机的
DROP TABLE IF EXISTS T;
CREATE TABLE T
(ID INT AUTO_INCREMENT PRIMARY KEY,CID INT,TRACKER VARCHAR(20));
INSERT INTO T(CID,TRACKER) VALUES
(1,'F'),(1,'I'),(1,'O'),
(2,'O'),(2,'F'),(2,'I'),
(3,'O'),(4,'F'),
(5,'F'),(5,'I'),(5,'O'),(5,'I'),(5,'F'),(5,'O'),(5,'F');
SELECT T.*,
CASE WHEN T.TRACKER = 'O' THEN
COALESCE(
(SELECT C.TRACKER FROM T C WHERE C.CID = T.CID AND C.ID < T.ID ORDER BY C.CID,C.ID DESC LIMIT 1),
(SELECT C.TRACKER FROM T C WHERE C.CID = T.CID AND C.ID > T.ID ORDER BY C.CID,C.ID LIMIT 1),
T.TRACKER
)
ELSE T.TRACKER
END TRACKER
FROM T
ORDER BY CID,ID;
+----+------+---------+---------+
| ID | CID | TRACKER | TRACKER |
+----+------+---------+---------+
| 1 | 1 | F | F |
| 2 | 1 | I | I |
| 3 | 1 | O | I |
| 4 | 2 | O | F |
| 5 | 2 | F | F |
| 6 | 2 | I | I |
| 7 | 3 | O | O |
| 8 | 4 | F | F |
| 9 | 5 | F | F |
| 10 | 5 | I | I |
| 11 | 5 | O | I |
| 12 | 5 | I | I |
| 13 | 5 | F | F |
| 14 | 5 | O | F |
| 15 | 5 | F | F |
+----+------+---------+---------+
15 rows in set (0.002 sec)
推荐阅读
- python - 如何从 url 中删除查询字符串?
- javascript - 滚动在三星互联网上不起作用
- twitter-bootstrap - 如何阅读引导程序源代码?
- javascript - 在函数中初始化、添加、保存局部变量,以及使用函数访问该变量
- python - AttributeError:“函数”对象没有属性“place_id”
- ruby-on-rails - 如何在 Ruby on Rails 的网站上以 .pptx 或 .pdf 格式显示数据库中的文件
- git - Git 镜像和创建管道
- javascript - 如果将 for 循环的迭代计数作为变量,会发生什么?
- html - 为什么这个 h3/a 元素底部有多余的空间?
- android - 在 kotlin 中我应该在 if (data!=null) 和 data?.let 之间使用哪一个?