最近帮同事弄一功能:平均百分比。譬如说做某件事有5步,平均下来也就是:20%,40%,60%,80%,100%。
要是用代码来写的话比较容易:先获取总共有多少步,然后取个平均数,再按照排列顺序查询数据并循环数据,添加相应的百分比,最后设置最后一步为100%。
这样子写起来是不难,但我这个人比较懒,不想用代码写想用一个SQL直接搞定。再加上这个功能第一版时就是用一个SQL来实现的,这个第二版我不想处理的太复杂。
我的处理思路如下:
1、获取平均值,这个比较简单,一个avg就能搞定啦:
declare @avg int; select @avg = (100/count(S_PRO_ID)) from S_ProgressDESC where S_PRO_ID=5; print @avg;
2、将每个步骤排序,这个也不难,可以用SQL Server里面的row_num()方法:
select row_number() over (order by a.S_showorder) as per, a.S_ID as s_id from S_ProgressDESC a where a.S_PRO_ID=5
PS:可以参考:http://blog.csdn.net/dxnn520/article/details/8093628,http://blog.csdn.net/star8816/article/details/3033888
3、将每个步骤按照排序乘以平均数,这个有点难。需要将以上两步联合起来并更新表。试了各种常用的如两个表联合更新,不常用的如将排序后的数据弄成需要更新表的一个字段再更新,都失败了。最后想到用子查询,自己写了几个看似没有问题,却无法执行的SQL。最后在百度上搜到一个有启发的方法,链接如下:http://576017120.iteye.com/blog/1947154(也不知道他这个是怎么执行对的,反正在我的机器上就老报错)。经启发并修改之后的SQL如下:
--1、获取平均值 declare @avg int; select @avg = (100/count(S_PRO_ID)) from S_ProgressDESC where S_PRO_ID=5; print @avg; --2、排序并更新 update S_ProgressDESC set S_PRO_NUM = @avg * aa.per from ( select row_number() over (order by a.S_showorder) as per, a.S_ID as s_id from S_ProgressDESC a where a.S_PRO_ID=5 ) as aa where S_PRO_ID=5 and S_ProgressDESC.S_ID=aa.S_ID
4、将最后一步的百分比设置为100%:
update S_percent='100%' from S_ProgressDESC where S_showorder=( select max(S_showorder) from S_ProgressDESC where S_PRO_ID=5) where S_PRO_ID=5;
PS:测试环境:SQL Server 2005
相关推荐
在SQL Server中,`row_number()` 和 `partition by` 是两个非常重要的功能,它们一起为处理复杂的数据分组和排序问题提供了强大的解决方案。`row_number()` 是一个内置的排名函数,而 `partition by` 是一个窗口函数...
在SQL Server中,排序是数据分析和数据处理过程中非常常见的需求。`row_number()`, `rank()`, 和 `dense_rank()` 是三个重要的窗口函数,用于为查询结果集中的每一行分配唯一的序列号,常用于分组、排名或者实现分区...
在SQL Server中,`ROW_NUMBER()`函数是窗口函数的一种,它在每个分组或分区中生成一个唯一的递增数字。`OVER()`子句定义了分组或分区的逻辑,`ORDER BY`子句则决定了行号的生成顺序。由于`ORDER BY`不能直接放在`...
因此,如果你想选择第n行后的所有行,你需要使用子查询来实现: ```sql SELECT * FROM ( SELECT * FROM emp ORDER BY sal DESC ) WHERE ROWNUM ; ``` 相比之下,`ROW_NUMBER()` 是一种窗口函数(分析函数),它在...
本文将详细介绍如何使用SQL中的`ROW_NUMBER()`函数来实现这一功能,并进一步探讨如何通过该函数来合并多个查询结果。 #### 一、ROW_NUMBER()函数的基本用法 `ROW_NUMBER()`函数可以为结果集中的每行分配一个唯一的...
Oracle数据库提供了多种方法来实现分页查询,其中包括使用ROWNUM伪列、游标(CURSOR)以及Oracle的高级分页功能如ROW_NUMBER()、RANK()和DENSE_RANK()等。 1. ROWNUM伪列: ROWNUM是Oracle数据库特有的一个伪列,它...
String sql = "SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY some_column) AS row_num, your_columns FROM your_table) WHERE row_num BETWEEN ? AND ?"; PreparedStatement pstmt = connection.prepare...
在Oracle数据库中,常见的分页查询方法有ROWNUM和ROW_NUMBER()函数,以及使用子查询和连接操作来实现分页。 1. ROWNUM方法: ROWNUM是Oracle中的内置伪列,它会为每一行数据生成一个唯一的数字,从1开始递增。但...
4. `ROWNUM` 不能在 `WHERE` 子句中直接使用来获取第n行之后或之前的行,而 `ROW_NUMBER()` 可以通过子查询实现。 在实际应用中,根据具体需求选择使用 `ROWNUM` 或 `ROW_NUMBER()`。如果需要简单的行号分配且不...
总结,自定义翻页SQL在Oracle中可以通过`ROWNUM`、`ROW_NUMBER()`等方法实现,结合工具和源码可以简化开发过程并提高性能。理解这些概念和技术,对于数据库管理和应用程序开发至关重要。在实际应用中,还需考虑并发...
对于 SQL Server 2000 版本,由于不支持 `ROW_NUMBER()` 函数,因此实现分页查询相对复杂。一种常用的方法是通过排除前 N 行来达到目的。 **SQL 示例**: ```sql SELECT TOP page_size * FROM table_name WHERE ID ...
在内层查询中,我们对`transaction_date`进行排序,如果当前行的日期与前一行相同,`@row_num`就递增,否则重置为1。这样,每组(每天)的行号就按照交易价格降序排列了。外层查询通过`WHERE t.row_num 来筛选出每天...
- **定义**: 在SQL Server中,`IDENTITY`列用于自动递增的数值类型列,常用于主键。 - **优点**: 自动生成唯一值,简化开发工作。 **2.2 处理已删除行的问题** - **问题**: 当表中有数据被删除后,`IDENTITY`列...
在SQL语句中,通常使用`ROWNUM`伪列来实现分页。`ROWNUM`表示每条记录的顺序号,从1开始递增。例如,如果我们想要获取前10条记录,可以这样写: ```sql SELECT * FROM (SELECT ROW_NUMBER() OVER() AS ROWNUM, t.* ...
在SQL Server中,`ROW_NUMBER()`函数是一种常用的用于为结果集中的每一行分配一个唯一的整数行号的工具,但在MySQL中,这个函数并不存在。然而,MySQL提供了类似的功能,可以通过变量赋值来实现行号的生成。下面将...
SELECT department_id, employee_name, ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS row_num FROM employees; ``` 这将为每个部门的员工按工资降序分配一个行号。 二、RANK() 与ROW_...
`ROW_NUMBER()` 函数为每一行分配一个唯一的数字,这个数字从1开始递增。如果有 `PARTITION BY` 子句,那么每个分区都会从1重新开始编号。对于 `ORDER BY` 子句中具有相同值的行,其编号是非确定性的,也就是说这些...
总的来说,`ROWNUM`伪列是Oracle中实现简单分页查询的一个有效工具,但当面对更复杂的需求时,可能需要结合使用`ROW_NUMBER()`和其他窗口函数。正确理解和运用这些功能,能帮助你更高效地处理大数据集,并提供流畅的...