2011-04-20 63 views
24

我有一份報告,看起來是這樣的:SQL:如何選擇早到行

CompanyA  Workflow27  June5 
CompanyA  Workflow27  June8 
CompanyA  Workflow27  June12 
CompanyB  Workflow13  Apr4 
CompanyB  Workflow13  Apr9 
CompanyB  Workflow20  Dec11 
CompanyB  Wofkflow20  Dec17 

這與SQL(特別是T-SQL版本的服務器2005)完成:

SELECT company 
    , workflow 
    , date 
FROM workflowTable 

我希望報告只顯示每個工作流程的最早日期:

CompanyA  Workflow27  June5 
CompanyB  Workflow13  Apr4 
CompanyB  Workflow20  Dec11 

任何想法?我無法弄清楚這一點。我試過使用一個嵌套select來返回最早的托盤日期,然後在WHERE子句中設置它。如果只有一個公司,這很好用:

SELECT company 
    , workflow 
    , date 
FROM workflowTable 
WHERE date = (SELECT TOP 1 date 
       FROM workflowTable 
       ORDER BY date) 

但是,如果該表中有多個公司,這顯然不起作用。任何幫助表示讚賞!

回答

39

只需使用min()

SELECT company, workflow, MIN(date) 
FROM workflowTable 
GROUP BY company, workflow 
7
SELECT company 
    , workflow 
    , MIN(date) 
FROM workflowTable 
GROUP BY company 
     , workflow 
17

在這種情況下,一個相對簡單的GROUP BY可以工作,但在一般情況下,當有更多的列,你不能爲了通過,但你從特定希望他們它們與相關行,你可以使用鑰匙的所有部件要麼加入回到細節或使用OVER()

Runnable example (Wofkflow20 error in original data corrected)

;WITH partitioned AS (
    SELECT company 
     ,workflow 
     ,date 
     ,other_columns 
     ,ROW_NUMBER() OVER(PARTITION BY company, workflow 
          ORDER BY date) AS seq 
    FROM workflowTable 
) 
SELECT * 
FROM partitioned WHERE seq = 1 
+0

爲什麼WITH命令在它之前有一個分號?我在其他幾次見過這種情況,起初一直認爲這是我正在查看的人的代碼的錯字 – 2016-07-21 16:01:57

+1

預防性慣例。 WITH * must *是語句中的第一句,SQL Server不強制所有以分號結尾的語句。 – 2016-07-21 16:04:00