2013-01-01 91 views
0

我有一個表,火車這樣的數據結構:如何從分組行中的第一行/最後一行獲取值?

from | to | connection_id | date 
------+----+---------------+------ 
    A | B | 1    | some 
    B | C | 1    | dates 
    B | D | 2    | I can 
    D | E | 2    | sort 
    E | C | 2    | by 

我想組由CONNECTION_ID列中的數據,結果我想擁有的是:

from | to | connection_id 
------+----+--------------- 
    A | C | 1    
    B | C | 2    

所以我想獲得分組行中第一行的起始值和分組行中最後一行的起始值。要獲取最後一行和第一行,需要按日期列排序。如何從分組行中的第一行/最後一行獲取一個值?

編輯:澄清:對於每個CONNECTION_ID我想有從該行最低的日期值和從該行最高的日期值,值的價值。

+0

路由總是連接?給你的樣本數據,一個簡單的MIN()和max()會工作,但如果你能有一個像行'G,H,2,etc'存在針對同一連接的兩個獨立的路線。你需要處理這種情況嗎? – fthiella

+0

路由時總是連接,但分鐘()和max()不工作,因爲可以有一列火車經由d和E選自B將C(像在更新後的樣本數據),MIN()/ MAX()會給B和E,對嗎? – levu

回答

3

如果行可以通過date現場訂購,我認爲你可以這樣做:

select t1.`from`, t2.`to`, mm.connection_id 
from (
    select connection_id, min(`date`) as minDate, max(`date`) as maxDate 
    from trains 
    group by connection_id) mm 
    inner join trains t1 on mm.connection_id=t1.connection_id and t1.`date`=mm.minDate 
    inner join trains t2 on mm.connection_id=t2.connection_id and t2.`date`=mm.maxDate 

在這裏,我選擇第一和每CONNECTION_ID的最後一排,取從第一行from列,從最後的to列。或者你也可以使用這個技巧:

select 
    SUBSTRING_INDEX(GROUP_CONCAT(`from` ORDER BY `date`), ',', 1) as `from`, 
    SUBSTRING_INDEX(GROUP_CONCAT(`to` ORDER BY `date`), ',', -1) as `to`, 
    connection_id 
from trains 
group by connection_id 
+0

+1 @fthiella我錯過了這一個,並感謝技巧:)還沒有更新我的。 – bonCodigo

1

您可以試試order by兩個selectunion。像下面這樣:

Select * from yourtable 
group by connection_id 
order by [from] desc limit 1 
union 
select * from yourtable 
group by connection_id 
order by [to] asc limit 1 
+0

+1,儘管我認爲你的一個Order By子句應該在[to]上。 –

+0

感謝@PhilSandler我只是更新;) – bonCodigo

+0

@bonCodigo你必須把子查詢'()'當你使用一個聯合查詢,否則不允許使用ORDER BY和LIMIT(他們只能應用一次,但對於整個聯合查詢)。然而,這並沒有給出正確的結果是:你必須提取第一'from'場併爲每CONNECTION_ID最後'to'場,用'下令date'列 – fthiella

相關問題