Sql server SQL Server-创建视图以检索给定日期之前的最新值

Sql server SQL Server-创建视图以检索给定日期之前的最新值,sql-server,view,partitioning,Sql Server,View,Partitioning,假设我在SQL Server(2012)中有下表: 我想创建一个视图,对于Col1中的每个值,返回给定日期的Val中的最新值 因此,我的看法如下: MyView: Date1: Col1: Val: 1/2/2016 c1 Val2 1/5/2016 c2 Val5 1/8/2016 c3 Val8 SELECT Date1 , Col1 , Val FROM ( SELECT

假设我在SQL Server(2012)中有下表:

我想创建一个视图,对于Col1中的每个值,返回给定日期的Val中的最新值

因此,我的看法如下:

MyView:
Date1:     Col1:    Val:
1/2/2016   c1       Val2
1/5/2016   c2       Val5
1/8/2016   c3       Val8
SELECT
    Date1
    , Col1
    , Val
FROM (
        SELECT
            Date1
            , Col1
            , Val
            , ROW_NUMBER() OVER (PARTITION BY Col1 ORDER BY Col1, Date1 DESC) as version_num
        FROM 
            MyTable
        WHERE 
            Date1 <= '1/6/2016' 
      ) orderedtable
WHERE 
    version_num = 1
更具体地说,我可以查询我的观点,例如:

SELECT * FROM MyView WHERE Date1 < '1/6/2016'

Result:
Date1:     Col1:    Val:
1/2/2016   c1       Val2
1/5/2016   c2       Val5
1/6/2016   c3       Val6
从MyView中选择*日期1<'1/6/2016'
结果:
日期1:Col1:Val:
2016年1月2日c1 Val2
2016年1月5日c2 Val5
2016年1月6日c3 Val6


SELECT*FROM MyView WHERE Date1看起来您在搜索参数化视图。在
SQL Server
中,不能将变量传递给视图,但可以使用:

编辑:

如果需要所有值,用户可以传递
NULL

SELECT *
FROM dbo.my_func(NULL);

你想要什么样的东西?哇-@lad2025!-那么,我可以创建函数,然后将其合并到视图中?我需要创建某种联接——我从未将表联接到函数。你能回答这个问题吗?它会有效率吗?顺便说一句,你不需要按Col1、Date1排序,因为你已经按Col1进行了分区<代码>按日期订购1
就足够了。谢谢但是我如何基于此创建一个视图,用户可以指定日期或不指定日期-基本上创建一个与
Date1
列上的
MyTable
关联的视图?很抱歉,我仍然很困惑-你的意思是没有办法交叉应用
或任何东西来创建一个可查询的视图吗?@JohnBustos那么你想构建一个视图作为表顶值函数吗?关键是要使用函数而不是视图。是的,我需要一个视图,因为我的原始表有更多的列(这只是一个简单的示例),而且它们可能仍然希望查询另一列,例如
select*from myview,其中col3='xxx'
)-在您的示例中,他们总是需要指定一个日期变量——我想知道他们是否可以全程处理一个表。
SELECT
    Date1
    , Col1
    , Val
FROM (
        SELECT
            Date1
            , Col1
            , Val
            , ROW_NUMBER() OVER (PARTITION BY Col1 ORDER BY Col1, Date1 DESC) as version_num
        FROM 
            MyTable
        WHERE 
            Date1 <= '1/6/2016' 
      ) orderedtable
WHERE 
    version_num = 1
CREATE FUNCTION dbo.my_func(@d DATE)
RETURNS TABLE
AS
RETURN(
SELECT  Date1
       ,Col1
       ,Val
FROM (SELECT 
        Date1
        ,Col1
        ,Val
        ,ROW_NUMBER() OVER (PARTITION BY Col1 ORDER BY Date1 DESC) as version_num
       FROM MyTable
       WHERE Date1 <= @d 
      ) orderedtable
WHERE version_num = 1)
GO


SELECT *
FROM dbo.my_func('1/6/2016')  -- it behaves as normal table
-- JOIN/WHERE ...
╔═════════════════════╦══════╦══════╗
║        Date1        ║ Col1 ║ Val  ║
╠═════════════════════╬══════╬══════╣
║ 02.01.2016 00:00:00 ║ c1   ║ Val2 ║
║ 05.01.2016 00:00:00 ║ c2   ║ Val5 ║
║ 06.01.2016 00:00:00 ║ c3   ║ Val6 ║
╚═════════════════════╩══════╩══════╝
SELECT *
FROM dbo.my_func(NULL);
CREATE FUNCTION dbo.my_func(@d DATE = '2099-01-01T00:00:00')
...

SELECT *
FROM dbo.my_func(default);