MySQL объединяет значения строк в одну строку - PullRequest
3 голосов
/ 30 ноября 2011

Мне нужно создать запрос на выборку для таблицы, которая объединяет строки для каждой группы в столбце «Число», чтобы получить единственную строку со всеми доступными, но самыми последними (по идентификатору) столбцами.

Вот что я имею в виду, мне нужно взять такой стол:

ID | Number |   Date 1   |   Date 2   |   Date 3   |
----------------------------------------------------
1  |   1    | 2011-10-01 |    NULL    |    NULL    |
2  |   1    |    NULL    | 2011-10-25 |    NULL    |
3  |   1    |    NULL    |    NULL    | 2011-11-13 |
4  |   1    | 2011-10-03 |    NULL    | 2011-11-10 |
5  |   2    |    NULL    |    NULL    | 2012-01-01 |
6  |   2    | 2012-03-11 |    NULL    |    NULL    |

И вернуть это (столбец идентификатора не связан с вышеуказанным столбцом идентификатора):

ID | Number |   Date 1   |   Date 2   |   Date 3   |
----------------------------------------------------
1  |    1   | 2011-10-03 | 2011-10-25 | 2011-11-10 |
2  |    2   | 2012-03-11 |    NULL    | 2012-01-01 |

Таким образом, для всех строк в каждой группе. По столбцу «Number» мне нужны все доступные значения столбцов из всех строк в группе, но только последнее значение для каждого столбца. Последний определяется по наибольшему значению 'ID', где существует значение в столбце. (Если в какой-либо строке группы нет значения в столбце, используется значение Null).

Спасибо

Ответы [ 4 ]

1 голос
/ 01 декабря 2011

Спасибо за все предложения.К сожалению, я не смог заставить ни один из текущих ответов работать на меня.К сожалению, я не могу полагаться на использование агрегатных функций для даты, поскольку они могут не быть максимальными или минимальными значениями.Использование подзапроса на столбец даты было очень умным, но я не смог заставить запрос работать достаточно быстро для моих целей.(Он должен работать почти мгновенно, но, несмотря на правильную настройку индексов, я говорил о нем слишком много времени.)

Решение, которое я придумал, состоит в создании новой таблицы со структурой для хранениярезультаты, а затем поддерживать эту таблицу в актуальном состоянии с рядом триггеров.Фактическая рассматриваемая таблица периодически обновляется, и вставки в таблицу должны позволять мне обновлять отдельную таблицу с помощью триггеров, что дает мне то, что мне нужно.

1 голос
/ 30 ноября 2011

Вы можете использовать подзапрос для выбора различных чисел. Затем для каждого числа вы можете искать различные столбцы в другом подзапросе. Подзапрос будет искать строку с наибольшим ID, где этот конкретный столбец не равен нулю.

select  yt.Number
,       (
        select  top 1 [Date 1]
        from    YourTable d1
        where   d1.Number = yt.Number
                and d1.[Date 1] is not null
        order by
                d1.ID desc
        ) as [Date 1]
,       (
        select  top 1 [Date 2]
        from    YourTable d2
        where   d2.Number = yt.Number
                and d2.[Date 2] is not null
        order by
                d1.ID desc
        ) as [Date 2]
,       ...
from    (
        select  distinct Number
        from    YourTable
        ) as yt
0 голосов
/ 30 ноября 2011

Номер «ID», который вы ищете, кажется простым последовательным, представляющим окончательный номер «строки» набора результатов (как вы указали, не имеет никакого отношения к исходному столбцу ID). Итак, принимая во внимание предыдущий ответ Цилиндрика, просто немного расширим ...

select 
      @FinalRow := @FinalRow +1 as ID,
      PreQuery.*
   from
      ( SELECT 
              Number, 
              MAX(Date1), 
              MAX(Date2), 
              MAX(Date3)
           FROM 
              MyTable
           GROUP BY 
              Number 
           ORDER BY 
              Number ) PreQuery,
      (select @FinalRow := 0 ) SQLVars   
0 голосов
/ 30 ноября 2011

Это влияет на ваши данные, вы также можете использовать агрегатные функции. *

Если ваши данные всегда имеют нулевые значения в других строках, агрегатные функции будут их игнорировать.Это означает, что вы можете использовать GROUP BY, чтобы получить одну строку.

SELECT ID, Number, MAX(Date1), MAX(Date2), MAX(Date3)
FROM MyTable
GROUP BY ID, Number

* ПРИМЕЧАНИЕ: Это будет работать только в том случае, если вы знаете, что всегда хотите получить МАКС (или МИН) значенийконечно.В своем вопросе вы утверждаете, что вам нужен тот, у кого самый высокий идентификатор, поэтому мое решение может не сработать.

...