web-dev-qa-db-fra.com

SQL: comment sélectionner la première ligne

J'ai un rapport qui ressemble à ceci:

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

Cela se fait avec SQL (en particulier, T-SQL version Server 2005):

SELECT company
   , workflow
   , date
FROM workflowTable

J'aimerais que le rapport affiche uniquement les premières dates pour chaque flux de travail:

CompanyA      Workflow27     June5
CompanyB      Workflow13     Apr4
CompanyB      Workflow20     Dec11

Des idées? Je ne peux pas comprendre ça. J'ai essayé d'utiliser une sélection imbriquée qui renvoie la date de plateau la plus ancienne, puis de la définir dans la clause WHERE. Cela fonctionne très bien s'il n'y avait qu'une seule entreprise:

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

mais cela ne fonctionnera évidemment pas s'il y a plus d'une entreprise dans ce tableau. Toute aide est appréciée!

29
dvanaria

Utilisez simplement min()

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

Dans ce cas, un GROUP BY Relativement simple peut fonctionner, mais en général, quand il y a des colonnes supplémentaires où vous ne pouvez pas passer commande mais que vous les voulez à partir de la ligne particulière à laquelle elles sont associées, vous pouvez soit rejoindre au détail en utilisant toutes les parties de la clé ou utilisez OVER():

Exemple exécutable (erreur Wofkflow20 dans les données d'origine corrigée)

;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ᵀᴹ