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 :
Tabla Mantenciones :
Tabla deseada :
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
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:
CTE's
para hacer más simple la consulta, pero podría utilizarse una subconsulta también, la idea es materializar un enumerador de filasROW_NUMBER()
generamos un numerador por marca
y en relación al orden dado por la diferencia de díasCorrect answer by Patricio Moracho on December 18, 2020
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP