AnswerBun.com

Consulta SQL Server según condición y fecha

Stack Overflow en español Asked by Fernando Aguayo on December 18, 2020

Hola por favor me ayudan con el siguiente resultado esperado en SQL Server:

Tabla Marcas :

introducir la descripción de la imagen aquí

Tabla Mantenciones :

introducir la descripción de la imagen aquí

Tabla deseada :

introducir la descripción de la imagen aquí

Debo obtener según una marca su mantención mas próxima a su fecha de ingreso.

Agradeceré algún ejemplo o guía respecto a esto, gracias.

create table #marcas (id int, marca nvarchar(40), fecha_ingreso date)
create table #mantenciones (id int, marca nvarchar(40), fecha_mantencion date)
insert into #marcas values (1,'FIAT','2020-03-10'),(2,'FORD','2020-04-05'),(3,'MAZDA','2020-05-01');
insert into #mantenciones values (1,'FIAT','2020-03-15'),(2,'FIAT','2020-03-17'),(3,'FIAT','2020-03-20');
insert into #mantenciones values (4,'FORD','2020-04-20'),(5,'FORD','2020-04-07');
insert into #mantenciones values (6,'MAZDA','2020-05-01'),(7,'MAZDA','2020-05-02');

SELECT * FROM #marcas;
SELECT * FROM #mantenciones
SELECT m.id,m.marca,ma.id,ma.fecha_mantencion FROM #marcas m

CROSS APPLY (SELECT TOP 1 *
 FROM #mantenciones
         WHERE Marca = m.Marca
         AND fecha_mantencion >= m.fecha_ingreso
         ORDER BY fecha_mantencion) ma;

DROP TABLE #mantenciones
DROP TABLE #marcas

One Answer

Entiendo que tu versión ya soporta ROW_NUMBER() y CTE's, por lo que podrías plantear algo como esto:

;WITH CTE AS (
SELECT m.id,
       m.marca,
       ma.id as 'id_mantencion',
       ma.fecha_mantencion,
       ROW_NUMBER() OVER (PARTITION BY m.marca 
                          ORDER BY datediff(day, m.fecha_ingreso, ma.fecha_mantencion) DESC) as RN
       FROM #marcas m
       LEFT JOIN #mantenciones ma
          on ma.marca = m.marca
 )
 SELECT id,
        marca,
        id_mantencion,
        fecha_mantencion
        FROM cte
        WHERE RN = 1;

Básicamente:

  • Usamos un CTE's para hacer más simple la consulta, pero podría utilizarse una subconsulta también, la idea es materializar un enumerador de filas
  • Con ROW_NUMBER() generamos un numerador por marca y en relación al orden dado por la diferencia de días
  • Finalmente solo nos quedamos con las filas número 1 que son las que justamente tienen la menor diferencia en días.

Correct answer by Patricio Moracho on December 18, 2020

Add your own answers!

Related Questions

Ocultar menu al hacer click fuera de el en React

1  Asked on January 6, 2022 by danielcrespo

   

Guardar formulario en una array PHP

2  Asked on January 6, 2022 by gmp

     

Multiple buscador en modelos laravel

1  Asked on January 5, 2022

       

Puedo cosultar en mysql por id si tengo un array de datos?

1  Asked on January 5, 2022 by alejandra-cervera

   

MENSAJE REGISTRO NO ENCONTRADO PHP

2  Asked on January 5, 2022 by mayra-ximena-vargas

         

Error con PreparedStatement

1  Asked on January 5, 2022

 

Error con @viewChild con renderer2

2  Asked on January 5, 2022 by mateo-morales

     

Problemas al acceder a web de Spring

1  Asked on January 4, 2022

     

Error 404 con archivos JSON en IIS

1  Asked on January 4, 2022 by farssharp

       

¿Como mover el cursor dentro de las coordenadas de un panel?

1  Asked on January 4, 2022 by javier-aceves

   

Ask a Question

Get help from others!

© 2022 AnswerBun.com. All rights reserved. Sites we Love: PCI Database, MenuIva, UKBizDB, Menu Kuliner, Sharing RPP, SolveDir