我有这个存储的功能
function GetPrevReading(
@utility int,
@asofdate datetime
) returns decimal(10,5)
此函数返回表中的上一个仪表读数,其中包括以下内容:
utility - int
date - datetime
reading - numeric(18,4)
当我在此表上使用select时,我想将日期设置为参数并从表中获取:
Utility Previous Reading
(distinct) GetPrevReading(utility from query, @date from parameter)
我希望函数GetPrevReading从当前行获取参数'utility'。 是否可以通过查询来完成此操作,还是应该创建存储过程?
例如,这是表格:
Utility Date Reading
1 2013-10-1 105.6
1 2013-11-1 123.72
2 2013-10-1 226.1
2 2013-10-1 238.18
现在,如果我将参数@date设置为2013-10-29,我应该得到这个结果:
Utility PreviousReading
1 105.6
2 226.1
在这里,我的函数应该在第一行获得@ utility = 1和@ asofdate ='2013-10-29',在第二行获得@ utility = 2和@ asofdate ='2013-10-29'。< / p>
答案 0 :(得分:0)
我是否理解这个问题;该函数返回此函数
GetPrevReading( 1,2013-10-29)
返回
1, 105.6
2, 226.1
您想要在函数及其结果和基础表之间加入吗?您可以使用Apply join
在SQL 2005 +中执行此操作Select
…
From tblUtilityReadings
Cross Apply GetPrevReading(tblUtilityReadings.utility, @date)
答案 1 :(得分:0)
尝试this。我修复了数据类型中的一些不一致性,并假设您的最后一行样本数据确实应该是2013-11-01作为日期。此外,写入函数的方式是,它没有得到之前的读数,而是那个日期的读数。
CREATE TABLE MyTable (
Utility Int,
Date Date,
Reading Decimal(10,5)
);
INSERT INTO MyTable (Utility, Date, Reading)
VALUES
(1,'2013-10-01', 105.60),
(1,'2013-11-01', 123.72),
(2,'2013-10-01', 226.10),
(2,'2013-11-01', 238.18);
CREATE FUNCTION dbo.GetPrevReading(
@utility int,
@asofdate datetime
)
RETURNS Decimal(10,5)
AS
BEGIN
RETURN (
SELECT TOP 1 Reading
FROM MyTable
WHERE Utility = @Utility
AND Date = @asofdate
ORDER BY Date DESC
)
END;
SELECT
Utility
,Date
,dbo.GetPrevReading(Utility, Date)
FROM (
SELECT Utility, Max(Date) Date
FROM MyTable
WHERE Date < '2013-10-29'
GROUP BY Utility
) x;