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!
Utilisez simplement min()
SELECT company, workflow, MIN(date)
FROM workflowTable
GROUP BY company, workflow
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
SELECT company
, workflow
, MIN(date)
FROM workflowTable
GROUP BY company
, workflow