Seleccionar registro con mayor valor en un campo

publicado por: Anonymous

EStoy haciendo una consulta en SQLServer donde requiero el registro de dias trabajados de x cantidad de empleados.

En los días en que estos están de Descanso, pueden trabajar obteniendo el día adicional.

La consulta que tengo me genera lo siguiente

id  cliente puesto  empleado    anno    mes dia turno
1   ACME    PUERTA  CORRECAMINOS    2016    6   1   001
1   ACME    PUERTA  CORRECAMINOS    2016    6   2   DESCANSO
1   ACME    BODEGA  CORRECAMINOS    2016    6   3   001
1   ACME    BODEGA  CORRECAMINOS    2016    6   4   001
1   ACME    PUERTA  CORRECAMINOS    2016    6   5   001
1   ACME    BODEGA  CORRECAMINOS    2016    6   6   001
1   ACME    BODEGA  CORRECAMINOS    2016    6   7   001
1   ACME    PUERTA  CORRECAMINOS    2016    6   8   001
1   ACME    BODEGA  CORRECAMINOS    2016    6   9   DESCANSO
2   ACME    BODEGA  CORRECAMINOS    2016    6   9   001 EXTRA
1   ACME    BODEGA  CORRECAMINOS    2016    6   10  001
1   ACME    BODEGA  CORRECAMINOS    2016    6   11  001
1   ACME    BODEGA  CORRECAMINOS    2016    6   12  001
1   ACME    BODEGA  CORRECAMINOS    2016    6   13  001
1   ACME    BODEGA  CORRECAMINOS    2016    6   14  001
1   ACME    BODEGA  CORRECAMINOS    2016    6   15  DESCANSO

El día 9 estuvo descansando pero laboró el dia como turno extra, lo que necesito es que no me salga duplicado el día 9 sino mostrar sólo el registro con el turno extra.

Mi consulta es algo así:

select id_registro, cliente,  puesto, empleado,
DATEPART(YEAR,fecha) anno, DATEPART(MONTH,fecha) mes, 
DATEPART(DAY,fecha) dia, turno
from programacion
where DATEPART(YEAR,fecha)=2016 and DATEPART(MONTH,fecha)=6

El resultado que necesito seria:

id  cliente puesto  empleado    anno    mes dia turno
1   ACME    PUERTA  CORRECAMINOS    2016    6   1   001
1   ACME    PUERTA  CORRECAMINOS    2016    6   2   DESCANSO
1   ACME    BODEGA  CORRECAMINOS    2016    6   3   001
1   ACME    BODEGA  CORRECAMINOS    2016    6   4   001
1   ACME    PUERTA  CORRECAMINOS    2016    6   5   001
1   ACME    BODEGA  CORRECAMINOS    2016    6   6   001
1   ACME    BODEGA  CORRECAMINOS    2016    6   7   001
1   ACME    PUERTA  CORRECAMINOS    2016    6   8   001
2   ACME    BODEGA  CORRECAMINOS    2016    6   9   001 EXTRA
1   ACME    BODEGA  CORRECAMINOS    2016    6   10  001
1   ACME    BODEGA  CORRECAMINOS    2016    6   11  001
1   ACME    BODEGA  CORRECAMINOS    2016    6   12  001
1   ACME    BODEGA  CORRECAMINOS    2016    6   13  001
1   ACME    BODEGA  CORRECAMINOS    2016    6   14  001
1   ACME    BODEGA  CORRECAMINOS    2016    6   15  DESCANSO

Intenté con MAX (id) pero no funciona.

solución

Puedes utilizar una CTE:

WITH ProgramacionOrdered ([id_registro], cliente, puesto, empleado, anno, mes, dia, turno, num)
AS (SELECT 
    id_registro, cliente, puesto, empleado, DATEPART(YEAR, fecha), DATEPART(MONTH, fecha), DATEPART(DAY, fecha),
    turno, ROW_NUMBER() OVER (PARTITION BY cliente, puesto, empleado, fecha ORDER BY id_registro DESC)
FROM programacion)
SELECT id_registro, cliente, puesto, empleado, anno, mes, dia, turno
FROM ProgramacionOrdered WHERE num=1
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *