Групповые тандемные записи
У меня есть такая таблица:
| A | B |
-----------------
| 22.1 | 15.8 |
| 12.15 | 4.55 | <- Duplicate record
| 12.15 | 4.55 | <- Duplicate record
| 12.15 | 4.55 | <- Duplicate record
| 30.4 | 44.12 |
| 10.5 | 7.58 |
| 31.2 | 65.1 | <- Duplicate record
| 31.2 | 65.1 | <- Duplicate record
| 9.4 | 7.8 |
| 12.15 | 4.55 | <- Same Duplicate record
| 12.15 | 4.55 | <- Same Duplicate record
| 12.15 | 4.55 | <- Same Duplicate record
| 31.2 | 65.1 | <- Same Duplicate record
| 31.2 | 65.1 | <- Same Duplicate record
Здесь я хочу группу A
а также B
, Но я хочу сгруппировать тандемные значения.
Таким образом, если между двумя одинаковыми записями есть разные записи, то должны появиться обе записи (одинаковые).
Например, мой ожидаемый результат должен быть:
| A | B |
-----------------
| 22.1 | 15.8 |
| 12.15 | 4.55 | <- Group 1
| 30.4 | 44.12 |
| 10.5 | 7.58 |
| 31.2 | 65.1 | <- Group 2
| 9.4 | 7.8 |
| 12.15 | 4.55 | <- Group 3 (Second Time)
| 31.2 | 65.1 | <- Group 4 (Second Time)
Что я пытаюсь это:
SELECT * FROM MyTable
GROUP BY A,B
но это дает мне неверный результат:
| A | B |
-----------------
| 22.1 | 15.8 |
| 12.15 | 4.55 |
| 30.4 | 44.12 |
| 10.5 | 7.58 |
| 31.2 | 65.1 |
| 9.4 | 7.8 |
Here `12.15` and `31.2` is skipped second time. But I want it.
Обратите внимание, я прочитал этот вопрос, но решение дано в PHP, а я хочу его в MySQL.
Я пытаюсь решить проблему в этом SQLFiddle.
1 ответ
У вас есть последовательный идентификатор в столбце? Если это так, вы можете попробовать что-то вроде:
SELECT t.A, t.B
FROM myTable t
WHERE NOT EXISTS
(
SELECT 1
FROM myTable t2
WHERE t2.A = t.A
AND t2.B = t.B
AND t2.Id = (SELECT MIN(t3.Id) FROM myTable t3 WHERE t3.Id > t.Id)
)
Если у вас нет идентификатора, вы можете попробовать следующее, но помните, что нет гарантии, что вы получите желаемые результаты; сервер может возвращать результаты в любом порядке по своему желанию, если вы не укажете столбец для заказа:
SELECT t.A, t.B
FROM
(
SELECT @curRow := @curRow + 1 AS Id, A, B
FROM myTable
JOIN (SELECT @curRow := 0) r ON 1=1
) t
WHERE NOT EXISTS
(
SELECT 1
FROM (
SELECT @curRow2 := @curRow2 + 1 AS Id, A, B
FROM myTable
JOIN (SELECT @curRow2 := 0) r ON 1=1
) t2
WHERE t2.A = t.A
AND t2.B = t.B
AND t2.Id = (
SELECT MIN(t3.Id)
FROM (
SELECT @curRow3 := @curRow3 + 1 AS Id, A, B
FROM myTable
JOIN (SELECT @curRow3 := 0) r ON 1=1
) t3
WHERE t3.Id > t.Id
)
)