创建函数/过程以返回表以获取最后一行

时间:2019-05-26 09:19:02

标签: sql sql-server stored-procedures max

我有几个表,每个表都有不同的键。

例如:Customer的键可以是2列或更多列。

输入-dbo.customer:

Customer e_Date    Value
------------------------
1000     2019-05-26  200
1000     2019-05-25  100
2000     2019-04-23   50
2000     2019-04-21   20

输出:

Customer  e_date       value
----------------------------
1000      2019-05-26    200
2000      2019-04-23     50 

每个用户(密钥)的最大日期及其值已返回。

我想在SQL中构建一个函数或过程,在其中输入表名和键名,并向我返回输出。返回表功能。

exec procedure get_Last_Row_By_Key (@Table_Name, @Key) 

,它将显示输出。

在此示例中:

exec procedure get_Last_Row_By_Key ('dbo.customer', Customer)

我猜想,当@key将是多个值时,我可以合并其他列以使它们成为一个列键。

2 个答案:

答案 0 :(得分:0)

使用row_number()窗口函数在函数中进行以下查询

 select customer,e_date,value from 
           (select *,row_number()over(partition by customer order by e_date desc) rn
 from table ) a where a.rn=1

答案 1 :(得分:0)

函数调用必须是这样的:

exec procedure get_Last_Row_By_Key ('dbo.customer', 'Customer', 'e_date')

要支持多个键,我将使用row_number(),即使这会在结果集中添加额外的列。因此,动态SQL如下所示:

declare @sql nvarchar(max);

set @sql = '
select t.*
from (select t.*,
             row_number() over (partition by [key] order by [datecol]) as seqnum
      from [table] t
     ) t
where seqnum = 1
';

set @sql = replace(@sql, '[table]', @table);
set @sql = replace(@sql, '[key]', @key);
set @sql = replace(@sql, '[datecol]', @datecol);

exec sp_executesql @sql;

注意:我在这里明确使用quotename()而不是 ,因此代码将允许多个列用于键顺序“ datecol”。

此外,作为练习,这可能对学习动态SQL和存储过程很有用。但总的来说,这种“通用”处理的尝试并不像看起来那样有用。知道SQL的人都知道如何编写查询以在表上执行所需的操作。他们不知道执行相同操作的自定义存储过程。