Convierta UDF escalar en función de selección a valor de tabla

tengo 2 mesas La tabla 1 (DateTable) contiene fechas y nombres de artículos, la tabla 2 (PriceTable) contiene precios a lo largo del tiempo y las fechas en que cambió el precio.

Tabla 1 (tabla de fechas)

| itemName |   Date   |
|    A     | 2012-8-22|
|    A     | 2012-9-2 |

Tabla 2 (Tabla de Precios)

| Update Date | Price|itemName|
|  2012-7-1   | 5.00 |   A    |
|  2012-8-1   | 5.50 |   A    |
|  2012-9-1   | 6.00 |   A    |

Mi tarea es, dada una fecha, quiero determinar cuál era el precio del artículo en esa fecha.

Actualmente estoy haciendo esto con una función escalar, que es realmente lenta. ¿Hay alguna manera de que pueda reescribir esto, ya sea como una función de valores de tabla o usando algo más que ayude a acelerar esto un poco? He estado mirando esto por un tiempo sin éxito.

Mis consultas actuales:

select
    d.date
    ,dbo.fn_GetPrice(d.date, 'A')
from DateTable d
where d.itemName = 'A'

y función

alter function fn_GetPrice(@date DateTime, @itemName varchar(50))
returns int
as
begin
declare @price int
    select @price = p.price
    from PriceTable p
    where p.itemName = @itemName
        and p.updateDate = (select MAX(p2.updateDate)
            from PriceTable p2
            where p2.updateDate < @date
                and p2.itemName = @itemName)
return @price
end

preguntado el 24 de agosto de 12 a las 19:08

1 Respuestas

¿Funcionaría esto? Reemplazo de la udf con solo un join?

select
    d.date,
    p.Price
from 
    DateTable d 
    join PriceTable p
        on p.itemName = d.itemName
        and p.updateDate = (
            select max(p2.updateDate)
            from PriceTable p2
            where 
                p2.updateDate < d.date
                and p2.itemName = p.itemName
        )
where d.itemName = 'A'

Respondido 24 ago 12, 19:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.