Solo quiero la última fecha para cada fila (casa), el número de entradas por casa varía, a veces puede haber una venta, a veces varias.
Date of sale | house number | street | price |uniqueref -------------|--------------|--------|-------|---------- 15-04-1990 |1 |castle |100000-| 1xzytt 15-04-1995 |1 |castle |200000-| 2jhgkj 15-04-2005 |1 |castle |800000-| 3sdfsdf 15-04-1995 |2 |castle |200000-| 2jhgkj 15-04-2005 |2 |castle |800000-| 3sdfsdfLo que tengo funcionando es lo siguiente
Crear VIEW as (v_orderedhouses) ORDER BY número de casa, calle con fecha ordenada en DESC para que se devuelva primero la fecha más reciente.
Luego introduzco eso en otra VIEW (v_latesthouses) usando DISTINCT ON (número de casa, calle). que me da;
Date of sale | house number | street | price |uniqueref -------------|--------------|--------|-------|---------- 15-04-2005 |1 |castle |800000-| 3sdfsdf 15-04-2005 |2 |castle |800000-| 3sdfsdfEsto funciona, pero parece que debería haber una solución más elegante. ¿Puedo acceder a la vista filtrada en un solo paso?
No necesita crear un montón de vistas, solo:
select distinct on(street, house_number) * from your_table order by street, house_number, -- those fields should be in the "order by" clause because it is in the "distinct on" expression date_of_sale desc; Para hacer esta consulta más rápida, puede crear un índice de acuerdo con el order by :
create index index_name on your_table(street, house_number, date_of_sale desc); No olvides analyse tus tablas regularmente (dependiendo de la velocidad de crecimiento):
analyse your_table;Puede usar la función de ventana row_number para esto
select * from ( select your_table.*, row_number() over(partition by house_number order by Date_of_sale desc) as rn from your_table ) tt where rn = 1Esto es lo que uso y funciona rápido (es una solución genérica, hasta donde probé, cada software de base de datos puede hacer esto):
SELECT t1.date_of_sale, t1.house_number FROM table t1 LEFT JOIN table t2 ON (t2.house_number = t1.house_number AND t2.date_of_sale>t1.date_of_sale) WHERE t2.pk IS NULL GROUP BY t1.date_of_sale, t1.house_number