0%

Leetcode177 Nth Highest Salary

Problem:

Intuition:

主要需要了解一下sql里面函数的用法。
自定义函数分为:标量值函数或表值函数两种。

标量值函数:如果 RETURNS 子句指定一种标量数据类型,则函数为标量值函数。
表值函数:如果 RETURNS 子句指定 TABLE,则函数为表值函数。
表值函数又分为两种:内嵌表值函数(行内函数)或多语句函数

如果 RETURNS 子句指定的 TABLE 不附带列的列表,则该函数为内嵌表值函数。
如果 RETURNS 子句指定的 TABLE 类型带有列及其数据类型,则该函数是多语句表值函数
如果你不晓得Returns从哪里来,请看创建函数的语法(这里是创建标量值函数的语法):

Create function 函数名(参数)
Returns 返回值数据类型
[with {Encryption | Schemabinding }]
[as]
begin
SQL语句(必须有return 变量或值)
End
复制代码
这里的with为附加选项:

首先看一个标量值函数

1
2
3
4
5
6
7
8
CREATE FUNCTION Foo(@ret int )  --传入了一个int类型的参数
RETURNS int --注意这里返回的是一个数据类型
AS
BEGIN
declare @n int
set @n = 3
return @n* @ret
END

函数我们创建好了,怎么调用呢,看看下面

1
select dbo.foo(2)

结果输出为6,这里需要注意的是:创建函数的时候不需要加dbo.,但在访问的时候,标量函数要加.dbo的,否则的话会报错“不是可以识别的 内置函数名称。”

2.首先看定义一个内嵌表值函数语法:

1
2
3
4
5
create function 函数名(参数)
returns table
[with {Encryption | Schemabinding }]
as
return(一条SQL语句)

还是来看个例子比较直观:

1
2
3
4
create function GetUser(@name varchar(10))
returns table
as
return select * from userInfo where userName=@name

函数创建好了,怎么调用呢

1
select * from getuser('admin')

上面的sql将会返回一行数据,如果记录存在的话,不存在的话当然就不显示了哈。调用是不是很简单呢。

3,这里就看第三种,多语句表值函数,查看定义:
–多句表格值函数
create function 函数名(参数)
returns 表格变量名table (表格变量定义)
[with {Encryption | Schemabinding }]
as
begin
SQL语句
end
–多句表格值函数包含多条SQL语句,至少有一条在表格变量中填上数据值

我们来看个例子:

1
2
3
4
5
6
7
8
create function GetInfo(@name varchar(20))
returns @cTable table(UserName varchar(10),UserPwd varchar(10))
as
begin
  insert into @cTable
  select userName,userPass from userinfo where username=@name
return --函数中最后一条语句必须是返回语句。
end
1
2
--调用
select * from GetInfo('admin')

UserName UserPwd
admin amin

对于sql的函数大体都这样了,这里我们来看个例子。

如果我们想在sql 中写一个函数,输入一个参数,返回是1到这个参数的求和值,参数当然是正整数类型的。

于是写了下面这个函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
create function sumUp(@number int)
returns int
as
begin
declare @sum int,@i int;
set @sum = 0;
set @i = 0;
while @i <= @number
begin
set @sum=@sum+@i
set @i=@i+1
end
return @sum
end

从1到10的求和

1
select dbo.sumUp(10)

55
从1到100的求和

1
select dbo.sumUp(100)

5050

Solution:

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE FUNCTION getNthHighestSalary ( N INT ) RETURNS INT BEGIN

SET N = N - 1;
RETURN (
SELECT (
SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT N, 1
)
);

END