TransWikia.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!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP