none
Ayuda con esta Sql - Coger registros que cumpla criterio fecha RRS feed

  • Pregunta

  • Buenas chic@s,

     Estoy aquí pegándome con una SQL que me trae de cabeza desde hace unos días...

     La cuestión es la siguiente, tengo una tabla tal que asi :

    VEHICULO        FECHA1          FECHA2
    CITROEN C4	2007-07-03	2008-06-21
    CITROEN C4	2013-08-19	2015-05-06
    RENAULT LAGU	2014-06-07	2015-05-14
    FIAT PANDA	2010-08-13	2013-06-08
    FIAT PANDA	2014-05-21	2015-05-18

    Y necesito sacar solo aquel registro de cada vehículo con la FECHA2 mas alta :

    VEHICULO        FECHA1          FECHA2
    CITROEN C4	2013-08-19	2015-05-06
    RENAULT LAGU	2014-06-07	2015-05-14
    FIAT PANDA	2014-05-21	2015-05-18

    En principio pensé que con un

    Select vehiculo, fecha1, max(fecha2)  from tabla group by fecha2, nombre

    Pero me devuelve error ya que fecha1 no esta en el agrupado

    Select vehiculo, fecha1, fecha2  from tabla where fecha2 = (select max(fecha2) from tabla group by nombre)

    Error, y creo que carece hasta de sentido ...

    Como siempre, os agradezco cualquier comentario ;)

    jueves, 27 de abril de 2017 10:53

Respuestas

  • Sí es una opción.

    Otra es utilizar una CTE con una cláusula OVER:

    CREATE TABLE #tmpFechas
    	(VEHICULO VARCHAR(20), FECHA1 DATETIME, FECHA2 DATETIME);
    
    INSERT INTO #tmpFechas VALUES ('CITROEN C4', '20070703', '20080621');
    INSERT INTO #tmpFechas VALUES ('CITROEN C4', '20130819', '20150506');
    INSERT INTO #tmpFechas VALUES ('RENAULT LAGU', '20140607', '20150514');
    INSERT INTO #tmpFechas VALUES ('FIAT PANDA', '20100813', '20130608');
    INSERT INTO #tmpFechas VALUES ('FIAT PANDA', '20140521', '20150518');
    
    WITH FECHAS_CON_ORDEN (VEHICULO, FECHA1, FECHA2, ORDEN) AS
    (SELECT VEHICULO, FECHA1, FECHA2, ROW_NUMBER() OVER (PARTITION BY VEHICULO ORDER BY FECHA2 DESC) AS ORDEN FROM #tmpFechas)
    SELECT * FROM FECHAS_CON_ORDEN WHERE ORDEN=1
    
    DROP TABLE #tmpFechas


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta mayoko jueves, 27 de abril de 2017 12:04
    jueves, 27 de abril de 2017 11:13

Todas las respuestas

  • Creo que lo tengo, al menos el resultado parece correcto, lo pongo por si puede servir a alguien en futuro y por si alguien quiere dar su opinión respecto a como lo he realizado.

    SELECT  [vehiculo]
          ,[fecha1]
          ,[fecha2]
      FROM [dbtest].[dbo].[fd_periodos]

    INNER JOIN (
       select [vehiculo] as vehiculo2, max([fecha2]) as maximafecha 
       from [dbtest].[dbo].[fd_periodos]
       group by [dbtest].[dbo].[fd_periodos].[vehiculo]
    ) as maxPer
    ON maxPer.maximafecha = [dbtest].[dbo].[fd_periodos].[fecha2] and maxPer.[vehiculo2]= [dbtest].[dbo].[fd_periodos].[vehiculo]

    gracias

    jueves, 27 de abril de 2017 11:04
  • Sí es una opción.

    Otra es utilizar una CTE con una cláusula OVER:

    CREATE TABLE #tmpFechas
    	(VEHICULO VARCHAR(20), FECHA1 DATETIME, FECHA2 DATETIME);
    
    INSERT INTO #tmpFechas VALUES ('CITROEN C4', '20070703', '20080621');
    INSERT INTO #tmpFechas VALUES ('CITROEN C4', '20130819', '20150506');
    INSERT INTO #tmpFechas VALUES ('RENAULT LAGU', '20140607', '20150514');
    INSERT INTO #tmpFechas VALUES ('FIAT PANDA', '20100813', '20130608');
    INSERT INTO #tmpFechas VALUES ('FIAT PANDA', '20140521', '20150518');
    
    WITH FECHAS_CON_ORDEN (VEHICULO, FECHA1, FECHA2, ORDEN) AS
    (SELECT VEHICULO, FECHA1, FECHA2, ROW_NUMBER() OVER (PARTITION BY VEHICULO ORDER BY FECHA2 DESC) AS ORDEN FROM #tmpFechas)
    SELECT * FROM FECHAS_CON_ORDEN WHERE ORDEN=1
    
    DROP TABLE #tmpFechas


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta mayoko jueves, 27 de abril de 2017 12:04
    jueves, 27 de abril de 2017 11:13