У меня есть такая таблица DATA
+--------+--------+----------+------+
| TranID | CustID | TransSeq | Type |
+--------+--------+----------+------+
| 1 | 100 | 1 | A |
| 2 | 100 | 2 | A |
| 3 | 100 | 3 | B |
| 4 | 200 | 1 | A |
| 5 | 200 | 2 | B |
| 6 | 200 | 3 | A |
| 7 | 200 | 4 | A |
| 8 | 200 | 5 | A |
+--------+--------+----------+------+
Я хочу получить все записи до Type B
.Следовательно, мой вывод будет выглядеть так:
+--------+--------+----------+------+
| TranID | CustID | TransSeq | Type |
+--------+--------+----------+------+
| 1 | 100 | 1 | A |
| 2 | 100 | 2 | A |
| 4 | 200 | 1 | A |
+--------+--------+----------+------+
Один из способов, который я могу придумать, следующий:
Шаг 1 - Создать временную таблицу, хранящую CustID и TransSeq, где type == B
CREATE TABLE TEMP AS
select CustID, TransSeq as TransSeq_B from DATA
where Type = "B"
Вывод шага 1 выглядит следующим образом
+--------+------------+------+
| CustID | TransSeq_B | Type |
+--------+------------+------+
| 100 | 3 | B |
| 200 | 2 | B |
+--------+------------+------+
Шаг 2 - объединить TEMP с данными, используя CustID
CREATE TABLE DATA_NEW AS
select D.TranID, D.CustID, D.TransSeq, D.Type, T.TransSeq_B
from DATA inner join TEMP on D.CustID = T.CustID
Вывод шага 2 выглядит следующим образом
+--------+--------+----------+------+------------+
| TranID | CustID | TransSeq | Type | TransSeq_B |
+--------+--------+----------+------+------------+
| 1 | 100 | 1 | A | 3 |
| 2 | 100 | 2 | A | 3 |
| 3 | 100 | 3 | B | 3 |
| 4 | 200 | 1 | A | 2 |
| 5 | 200 | 2 | B | 2 |
| 6 | 200 | 3 | A | 2 |
| 7 | 200 | 4 | A | 2 |
| 8 | 200 | 5 | A | 2 |
+--------+--------+----------+------+------------+
Шаг 3 - Запросите эту новую таблицу из шага 2 и сохраняйте записи, где все TransSeq меньше TransSeq_B
select * from DATA_NEW
where TransSeq < TransSeq_B
Есть ли эффективный способ сделать это, так как у меня много записей (> 20M)