Групповые тандемные записи

У меня есть такая таблица:

|     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)
)

Пример SQL Fiddle


Если у вас нет идентификатора, вы можете попробовать следующее, но помните, что нет гарантии, что вы получите желаемые результаты; сервер может возвращать результаты в любом порядке по своему желанию, если вы не укажете столбец для заказа:

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
   )
)

Пример SQL Fiddle

Другие вопросы по тегам