web-dev-qa-db-ja.com

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バージョンServer 2005)を使用して行われます。

SELECT company
   , workflow
   , date
FROM workflowTable

レポートには、各ワークフローの最も早い日付のみを表示したいと思います。

CompanyA      Workflow27     June5
CompanyB      Workflow13     Apr4
CompanyB      Workflow20     Dec11

何か案は?これを理解することはできません。最も早いトレイ日付を返すネストされた選択を使用し、それをWHERE句で設定しようとしました。これは、会社が1社しかない場合に最適です。

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

しかし、このテーブルに複数の会社がある場合、これは明らかに機能しません。どんな助けも大歓迎です!

29
dvanaria

単にmin()を使用してください

SELECT company, workflow, MIN(date) 
FROM workflowTable 
GROUP BY company, workflow
46
Achim

この場合、比較的単純な_GROUP BY_が機能しますが、一般に、順序付けできない追加の列があり、それらが関連付けられている特定の行から列が必要な場合は、結合して戻すことができますキーのすべての部分を使用した詳細、またはOVER()を使用:

実行可能な例(元のデータのWofkflow20エラーを修正)

_;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
_
21
Cade Roux
SELECT company
   , workflow
   , MIN(date)
FROM workflowTable
GROUP BY company
       , workflow
8
ypercubeᵀᴹ