-1

我有这个存储的功能

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    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'。

4

2 回答 2

0

我理解这个问题吗?函数为此调用返回

GetPrevReading( 1,2013-10-29) 

退货

1, 105.6
2, 226.1

您想在函数及其结果和基础表之间连接吗?您可以在 SQL 2005 + 中使用Apply连接执行此操作

Select 
…
From tblUtilityReadings
Cross Apply GetPrevReading(tblUtilityReadings.utility, @date)
于 2013-11-02T15:55:24.463 回答
0

试试这个。我修复了您的数据类型中的一些不一致之处,并假设您的最后一行示例数据确实应该以 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;
于 2013-11-02T15:56:05.030 回答