我有几个表,每个表都有不同的键。
例如: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
将是多个值时,我可以合并其他列以使它们成为一个列键。
答案 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的人都知道如何编写查询以在表上执行所需的操作。他们不知道执行相同操作的自定义存储过程。