MySQL объединяет несколько строк - PullRequest
1 голос
/ 27 июля 2010

У меня есть таблица, похожая на следующую (конечно, с большим количеством строк и полей):

category_id | client_id | date        | step
     1            1       2009-12-15    first_step
     1            1       2010-02-03    last_step

     1            2       2009-04-05    first_step
     1            2       2009-08-07    last_step

     2            3       2009-11-22    first_step

     3            4       2009-11-14    first_step
     3            4       2010-05-09    last_step

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

category_id | first_date | last_date
     1        2009-12-15   2010-02-03
     1        2009-04-05   2009-08-07
     2        2009-11-22   NULL
     3        2009-11-14   2010-05-09

Любая помощь будет оценена.* С помощью OMG Ponies вот решение:

SELECT t.category_id,
     MIN(t.date) AS first_date,
     CASE 
       WHEN COUNT(*) >= 2 THEN MAX(t.date)
       ELSE NULL
     END AS last_date
FROM TABLE t
GROUP BY t.category_id, t.client_id

Ответы [ 5 ]

4 голосов
/ 27 июля 2010

Обновлено на основе обновления / уточнения вопроса:

  SELECT t.category_id,
         MIN(t.date) AS first_date,
         CASE 
           WHEN MAX(t.date) = MIN(t.date) THEN NULL 
           ELSE MAX(t.date)
         END AS last_date
    FROM TABLE t
GROUP BY t.category_id, t.client_id
1 голос
/ 27 июля 2010

Попробуйте:

select
    category_id
    , min(date) as first_date
    , max(date) as last_date
from
    table_name
group by
    category_id
    , client_id
1 голос
/ 27 июля 2010

простой GROUP BY должен сделать трюк

SELECT   category_id
         , MIN(first_date)
         , MAX(last_date)
    FROM TABLE
GROUP BY category_ID
0 голосов
/ 27 июля 2010

Вам нужно выполнить два подзапроса, а затем соединить их вместе - что-то вроде следующего

выберите * от (Выбрать *, date as first_date от Таблица где step = "first_step") a левое соединение (выберите * дата как last_date от Таблица где step = "lastt_step") b on (a.category_id = b.category_id)

Наслаждайтесь!

0 голосов
/ 27 июля 2010

простой ответ:

  SELECT fist.category_id, first.date, last.date
    FROM tableName first
    LEFT JOIN tableName last
        ON first.category_id = last.category_id
        AND first.step = 'first_step'
        AND last.step ='last_step'

Вы также можете выполнять вычисления в запросе вместо того, чтобы просто возвращать два значения даты.

...