2010-07-27 79 views
1

我有类似表如下(当然有更多的行和字段):MySQL的合并多个行

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小马的帮助下,这里的解决方案:

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 

回答

4

基于问题的更新/澄清更新时间:

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 
+0

我可能已经简化了我的例子,所以我改变了它。每个类别都有很多条目。 – Mitchell 2010-07-27 16:08:06

+0

好的,只要我将GROUP BY子句更改为:GROUP BY t.category_id,t.client_id就可以工作。 – Mitchell 2010-07-27 16:27:53

+0

@Mitchell:更新,thx更新预期结果。 – 2010-07-27 16:31:12

1

简单GROUP BY应该做的伎俩

SELECT category_id 
     , MIN(first_date) 
     , MAX(last_date) 
    FROM TABLE 
GROUP BY category_ID 
+0

+1:但是你错过了FROM子句 – 2010-07-27 15:35:37

+0

是的,只要我将GROUP BY子句更改为:GROUP BY category_id,client_id就可以工作。 – Mitchell 2010-07-27 16:28:21

+0

我刚刚意识到它不会将last_date标记为NULL,因为没有last_date。 – Mitchell 2010-07-27 16:34:57

0

简单回答:

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' 

您也可以在查询中进行计算,而不是仅返回两个日期值。

+1

这实际上会给每个类别的每个日期组合。 – 2010-07-27 15:38:25

+0

你是对的......这就是我得到的太快。感谢您的支持。 – kniemczak 2010-07-27 15:55:44

+0

是的,我刚刚尝试过,并给出了很多结果 – Mitchell 2010-07-27 16:13:40

1

尝试:

 
select 
    category_id 
    , min(date) as first_date 
    , max(date) as last_date 
from 
    table_name 
group by 
    category_id 
    , client_id 
+0

我可能已经简化了我的例子,所以我改变了它。每个类别都有很多条目。 – Mitchell 2010-07-27 16:08:40

+0

是的,只要我将GROUP BY子句更改为:GROUP BY category_id,client_id就可以工作。 – Mitchell 2010-07-27 16:28:57

+0

好。我更新了我的查询以反映您的更改。 – wshato 2010-07-27 16:35:54

0

你需要做两个查询,然后加入他们在一起 - 像下面

选择 * 从 (选择 *, 日期FIRST_DATE 从 表 其中step =“first_step”)a 左连接(选择 * 日期LAST_DATE 从 表 其中步骤=上(a.category_id = b.category_id)

“lastt_step”)b 享受!

+0

我刚刚尝试过,就像kniemczak的回答,我认为它给出了日期的每个组合。 – Mitchell 2010-07-27 16:18:14