SQL Server将用户功能结果包含在选择查询中

时间:2013-11-02 15:18:50

标签: sql sql-server

我有这个存储的功能

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>

2 个答案:

答案 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;