Sintaxis SQL: Agrupar por ... ¿Funcionalidad agregada personalizada?
-
10-07-2019 - |
Pregunta
Tengo una situación como esta:
Tabla: FunTable
ItemKey ItemName ItemPriceEffectiveDate ItemPrice
11 ItemA 6/6/2009 $500
12 ItemA 6/15/2009 $550
13 ItemA 9/9/2009 $450
14 ItemB 3/9/2009 $150
15 ItemB 9/9/2009 $350
Necesito hacer lo siguiente:
Select
ItemName as ItemDescription,
(SELECT THE PRICE WITH THE LATEST EFFECTIVE DATE FROM TODAY THROUGH THE PAST)
FROM
FunTable
GROUP BY
ItemName
El resultado debería ser este:
ItemA $550
ItemB $150
Entonces, las fechas efectivas para los precios pueden variar desde hace 5 años hasta 5 años a partir de ahora. Quiero seleccionar el precio que sea efectivo hoy o en el pasado (¡no en el futuro! Aún no es efectivo). Tiene que ser el " más reciente " precio efectivo.
¿Alguna idea?
Solución
Algo como esto (no tiene sus nombres, pero se entiende) ...
WITH A (Row, Price) AS
(
SELECT Row_Number() OVER (PARTITION BY Item ORDER BY Effective DESC) AS [RN],
Price FROM Table2
WHERE Effective <= GETDATE()
)
SELECT * FROM A WHERE A.Row = 1
Otros consejos
select ft.ItemName,
price
from (select ItemName,
Max(ItemPriceEffectiveDate) as MaxEff
from FunTable
where ItemPriceEffectiveDate <= GETDATE()
group by ItemName) as d,
FunTable as ft
where d.MaxEff = ft.ItemPriceEffectiveDate;
Editar: cambió la consulta para que realmente funcione, suponiendo que el precio no cambie más de una vez al día.
No sé la respuesta en la parte superior de mi cabeza, pero supongo que quieres decir que necesitas usar una subconsulta, lo que podría hacer que sea una consulta muy costosa.
Puede ser más fácil extraer todos los datos en un código de uso para procesarlos usted mismo.
debería funcionar si lo haces
SELECT ItemName, MAX(ItemPriceEffectiveDate)
FROM FunTable
WHERE ItemPriceEffectiveDate < getDate()
GROUP BY ItemName