RANK函数用于返回结果集的分区内每行的排名。行的排名是相关行之前的排名数加一。RANK是运行查询时计算出的临时值。语法如下:

```sql

RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )

```

如果两个或多个行与一个排名关联,则每个关联行将得到相同的排名。

DENSE_RANK函数用于返回结果集分区中每行的排名,排名值没有间断。特定行的排名等于该特定行之前不同排名值的数量加一。语法如下:

```sql

DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )

```

如果两个或更多行在同一分区中具有相同的排名值,那么每个行将获得相同的排名。

积分排名实现的数据准备步骤如下:

1. 创建积分表(integral):

```sql

Create table integral ( userUid varchar(36), integralScore decimal(18,2) );

```

2. 创建用户表(UserInfo):

```sql

Create table UserInfo ( userUid varchar(36), user_name varchar(100) );

```

使用rank函数查询积分排名:

```sql

with integral AS ( select userUid, ISNULL(SUM(integralScore), 0) as integralScore from integral group by userUid ) , ranks AS( select rank() OVER(order by integralScore desc) as ranks,integral.integralScore,UserInfo.user_name from integral Inner Join UserInfo on integral.userUid=UserInfo.userUid ) select * from ranks;

```

使用dense_rank函数查询积分排名:

```sql

dense_rank

```

这是一个SQL查询,它使用了两个子查询。第一个子查询是`integral`,用于计算每个用户的积分总和。第二个子查询是`ranks`,使用`dense_rank()`函数对积分进行排序并为每个用户分配一个排名。最后,从`ranks`子查询中选择所有列。

以下是重构后的代码:

```sql

WITH integral AS (

SELECT userUid, ISNULL(SUM(integralScore), 0) AS integralScore

FROM integral

GROUP BY userUid

),

ranks AS (

SELECT DENSE_RANK() OVER (ORDER BY integralScore DESC) AS ranks, integral.integralScore, UserInfo.user_name

FROM integral

Inner JOIN UserInfo ON integral.userUid = UserInfo.userUid

)

SELECT * FROM ranks;

```