[数据库] 取指定表中某字段的累加和不超过总和80%的行

有表 Table_1, 字段 Value int,  P float 。5

要取出以 Value 字段倒序的 P 字段累加和 不超过 整个表中P字段总和的 80%的行。  并在返回列表中 加入字段 SUM ,存放当前行与前面所有行的累加和。

折腾了半天, 写了下面的查询sql:

declare @e float

select @e = sum(P) from [Table_1]
Set @e = @e * 0.8

;with T as (
        select [ID] = row_number() over(order by [Value] desc), [Value], [P],
            (select sum(P) from [Table_1] a where a.[Value] >= b.[Value]) ‘SUM‘
        from [Table_1] b
)
select * from T where [SUM] <= @e

共生成了 1.1 万行测试数据, 测试用试 12 秒, 运行效果图和原数据如上图所示。

有人写出了百万行只要14秒的sql:

select CollectData as value,0.00000 as P,0.00000 as _P into #data
from (select top 1000000 * from EMS_HisData18) xx order by CollectData desc

declare @sum decimal(18,8)
declare @p decimal(18,8)=0.80

select @sum=sum(value) from #data

update #data set @p=@p-(value/@sum),_P=@p

select * from #data where _P>=0

drop table #data
时间: 2024-10-12 07:05:05

[数据库] 取指定表中某字段的累加和不超过总和80%的行的相关文章

mysql5.7基础 向指定数据库的指定表中插入符合要求的数据

镇场文:       学儒家经世致用,行佛家普度众生,修道家全生保真,悟易理象数通变.以科技光耀善法,成就一良心博客.______________________________________________________________________________________________________ Operating System:UbuntuKylin 16.04 LTS 64bitmysql: Ver 14.14 Distrib 5.7.17, for Linux (

数据库修改一个表中的字段值等于另一个表字段值

(MS SQL Server)语句:Sql代码 update   b  set   ClientName   =   a.name   from   a,b   where   a.id   =   b.id    (Oralce)语句:Sql代码 update   b  set   (ClientName)   =  (SELECT name FROM a WHERE b.id = a.id) 原文地址:https://www.cnblogs.com/hujiapeng/p/8311710.h

数据库指定库表中的字段进行备份,并以表格的形式定时发送邮件到指定邮箱 ?

备份数据进行定时邮件发送 mkdir -p /opt/module/shell/ mkdir -p /opt/module/shell/sql/revenue.sql mkdir -p /opt/module/shell/csv/revenue #MailTool.jar 放在指定目录下 便于发送邮件使用 可自动生成表格 vim /opt/module/shell/daily_text.sh # !/bin/bash #数据库指定库.表中的字段进行备份,并以表格的形式发送邮件到指定邮箱 #定义变

数据库小记:根据指定名称查询数据库表名及根据指定名称查询数据库所有表中的字段名称(支持mysql/postgre)

意:本篇文章仅适用于mysql和postgre这两种数据库 1.查询数据库中所有表名及对应表的详细信息 select * from INFORMATION_SCHEMA.tables 2.根据指定名称查询表名(也可模糊查询,可查询表的详细信息) select *  from INFORMATION_SCHEMA.tables where table_name = 'eguid'; select * from INFORMATION_SCHEMA.tables where table_name l

【半转贴】解决SQL SERVER 2008数据库表中修改字段后不能保存

SQL SERVER 2008数据库表中修改字段后不能保存,这种情况将阻止保存要求重新创建表的更改一项的钩钩去掉就OK了 找到工具>选项>Designers>表设计器和数据库设计器 然后将“阻止保存要求重新创建表的更改” 的这一项的钩钩去掉就OK了 图片来自:http://www.jb51.net/article/42727.htm 刚好碰到这个问题,用的就是上面的方法解决的 [半转贴]解决SQL SERVER 2008数据库表中修改字段后不能保存

SqlServer中获取所有数据库,所有表,所有字段

原文:SqlServer中获取所有数据库,所有表,所有字段 一.获取所有数据库 select * from master.dbo.SysDatabases 二.获取某个库中所有表 SELECT * FROM SysObjects Where XType='U' --XType='U':表示所有用户表; --XType='S':表示所有系统表; 三.获取某表中的字段,字段类型等 SELECT * FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME='C

MYSQL 数据库名、表名、字段名查询

//查询所有表的所有字段: select * from information_schema.columns where table_name='sys_users' 效果: //查询指定表的所有字段: select * from information_schema.columns where table_name='sys_users' and TABLE_SCHEMA='taoke' 效果: //查询指定表的所有字段的指定类型,注释: 查询所有含有此字段名的表: SELECT * FROM

mysql5.7基础 查询指定表中的所有数据

镇场文:       学儒家经世致用,行佛家普度众生,修道家全生保真,悟易理象数通变.以科技光耀善法,成就一良心博客.______________________________________________________________________________________________________ Operating System:UbuntuKylin 16.04 LTS 64bitmysql: Ver 14.14 Distrib 5.7.17, for Linux (

mysql -- 存储过程 往数据表中新增字段

需求: 往某数据库的某个表中新增一个字段(若该字段已存在,则不做操作:若该字段不存在,则新增) 百度了n久,没有符合要求的例子,只有参考加自己琢磨,最终终于给弄出来了,以下是几个版本的更迭 第一版: DELIMITER $$ CREATE PROCEDURE insert_column() BEGIN IF NOT EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema='ltivalley' AND table_na