Создать функцию / процедуру для возврата таблицы, чтобы получить последние строки - PullRequest
0 голосов
/ 26 мая 2019

У меня есть несколько таблиц, каждая из которых имеет свой ключ.

Например: ключ для 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 голосов
/ 26 мая 2019

Вызов функции должен быть примерно таким:

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, знают, как написать запрос, чтобы сделать то, что он хочет на столе;они не знают пользовательских хранимых процедур, которые делают то же самое.

0 голосов
/ 26 мая 2019

введите ниже запрос в вашей функции, используя 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
...