2015-02-23 112 views
0

我是PostgreSQL和數據庫查詢的新手。僅在符合條件時才選擇行

我有一個user_id列表,大學課程採取,日期開始和完成。 某些用戶有多個條目,有時缺少開始日期或結束日期(或兩者)。

我需要檢索用戶最長的課程,或者如果缺少開始日期,則需要檢索最新的課程。 如果仍有多個選項可用,請在多個選項中隨機選擇。

例如

  • 用戶2(下)我想只有「經濟與政治」,因爲它具有最新的日期;
  • 在用戶6上,只有「電氣和電子工程」,因爲它是更長的路線。

我做不工作(我覺得我的脫軌)查詢:

(SELECT Q.user_id, min(Q.started_at) as Started_on, max(Q.ended_at) as Completed_on, 
q.field_of_study 
    FROM 
    (select distinct(user_id),started_at, Ended_at, field_of_study 
    from educations 
    ) as Q 
    group by Q.user_id, q.field_of_study) 
    order by q.user_id 

的結果是:

User_id Started_on  Completed_on Field_of_studies 
    2  "2001-01-01" ""    "International Economics" 
    2  ""    "2002-01-01" "Economics and Politics" 
    3  "1992-01-01" "1999-01-01" "Economics, Management of ..." 
    5  "2012-01-01" "2016-01-01" "" 
    6  "2005-01-01" "2009-01-01" "Electrical and Electronics Engineering" 
    6  "2011-01-01" "2012-01-01" "Finance, General" 
    6  ""    ""    "" 
    6  "2010-01-01" "2012-01-01" "Financial Mathematics" 

回答

0

我覺得這個查詢應該做的你需要什麼,它依靠計算ended_at和started_at之間的天數差,並且如果started_at爲空(使其爲非常長的間隔),則使用0001-01-01

select 
    educations.user_id, 
    max(educations.started_at) started_at, 
    max(educations.ended_at) ended_at, 
    max(educations.field_of_study) field_of_study 
from educations 
join (
    select 
    user_id, 
    max( 
    ended_at::date 
    - 
    coalesce(started_at, '0001-01-01')::date 
) max_length 
    from educations 
    where (started_at is not null or ended_at is not null) 
    group by user_id 
) x on educations.user_id = x.user_id 
    and ended_at::date 
     - 
     coalesce(started_at, '0001-01-01')::date 
     = x.max_length 
group by educations.user_id 
; 

Sample SQL Fiddle

+0

謝謝@jpw!您的查詢適用於大多數情況。但是它沒有優先考慮最近一次相同課程的課程。用戶9仍然顯示2個課程,因爲它們具有相同的長度:9;「」;「Katrinelund Gymnasium」;「1993-01-01」;「1996-01-01」 和-9;「」;「Birkbeck(University英國「;」2005-01-01「;」2008-01-01「 在上面的例子中,我只需要顯示2008年完成的一個。 – Marcello 2015-02-25 12:21:57

+0

@Marcello我已經更新了我的答案;它現在應該選擇最新的課程,但是如果有幾個課程的長度和日期相同,它應該選擇「最高」的課程(以曲線圖排序)。 – jpw 2015-02-25 13:21:24

+1

我添加了「獨特」來防止重複,現在它完全可用。謝謝! – Marcello 2015-02-26 08:58:17

相關問題