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. Это отлично работает, если есть только одна компания:

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

но это, очевидно, не будет работать, если в этой таблице будет более одной компании. Любая помощь приветствуется!

Ответ 1

Просто используйте min()

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

Ответ 2

В этом случае может работать относительно простой 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

Ответ 3

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