2010-07-27 60 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