组串联记录

时间:2012-11-09 04:30:08

标签: mysql sql group-by tandem

我有一张这样的表:

|     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

我希望将AB分组。但我想将串联值分组 因此,如果两个相同记录之间存在不同的记录,那么两个记录(相同)都应该来。

例如我的预期输出应该是:

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

注意,我读了this question,但解决方案是用PHP提供的,而我想在MySQL中使用它 我正试图在this SQLFiddle中解决问题。

1 个答案:

答案 0 :(得分:2)

您是否在列上有顺序ID?如果是这样,您可以尝试类似:

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 example


如果您没有身份证,可以尝试以下方法,但请记住,不能保证您会得到您想要的结果;除非您通过以下方式指定要排序的列,否则服务器可以按照任何顺序返回结果:

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 example