SQL: как выбрать самую раннюю строку - PullRequest
28 голосов
/ 21 апреля 2011

У меня есть отчет, который выглядит примерно так:

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)

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

Ответы [ 3 ]

45 голосов
/ 21 апреля 2011

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

SELECT company, workflow, MIN(date) 
FROM workflowTable 
GROUP BY company, workflow
20 голосов
/ 21 апреля 2011

В этом случае может работать относительно простой 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
8 голосов
/ 21 апреля 2011
SELECT company
   , workflow
   , MIN(date)
FROM workflowTable
GROUP BY company
       , workflow
...