2011-04-20 26 views
24

Tengo un informe que se ve algo como esto:SQL: ¿Cómo seleccionar Apertura Fila

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

Esto se hace con SQL (en concreto, T-SQL Server versión 2005):

SELECT company 
    , workflow 
    , date 
FROM workflowTable 

me gustaría que el informe muestre sólo las fechas más tempranas para cada flujo de trabajo:

CompanyA  Workflow27  June5 
CompanyB  Workflow13  Apr4 
CompanyB  Workflow20  Dec11 

¿Alguna idea? No puedo resolver esto. Intenté usar una selección anidada que devuelve la fecha de la bandeja más antigua y luego establecerla en la cláusula WHERE. Esto funciona muy bien si hubiera una sola empresa:

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

pero esto obviamente no va a funcionar si hay más de una empresa de esa tabla. ¡Cualquier ayuda es apreciada!

Respuesta

39

Utilice simplemente min()

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

En este caso, un relativamente simple GROUP BY puede trabajar, pero, en general, cuando hay columnas adicionales donde no se puede ordenar antes, pero que ellos quieren de lo particular fila que están asociados con, puede unirse de nuevo al detalle utilizando todas las partes de la clave o utilizar OVER():

Runnable example (Wofkflow20 error in original data corrected)

;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 
+0

¿Por qué el comando WITH tiene un punto y coma antes? He visto esto algunas otras veces y al principio siempre pensé que era un error del código de la persona que estaba viendo –

+1

Convención de precaución. WITH * must * es lo primero en una declaración y SQL Server no aplica todas las sentencias que terminan en punto y coma. –