【T-SQL】分布抽取部分数据
好吧,我确实不知道该怎么起这个标题,整了一个“分布”,感觉还有点高档,其实没啥技术含量,看完你就知道了。情况是这样,刚刚接到一个临时任务,需要让几个营业点的销售数据【变】少一点,就是在ERP的相关报表中,查询出来的数据要在指定区间,说白了就是那什么~你懂的,某些同行应该对这种任务很熟悉了,而有些同行可能正在或即将面临这样的任务,希望此文能提供一点思路。
我是第一次接到这种任务,感觉蛮新鲜,思量一下,决定在测试库动手脚,完了让他的ERP接入测试库,事情过后再切回正式库,细枝末节就不说了,重点说一下数据处理方法。根本原理是删除部分单据,因为报表的数据是从单据来的,单据少了,自然数字就小了(至于单据数据结构,不同的ERP方案当然有不同的设计,删除一张单涉及的数据修改也不同,我的情况是直接删除主单就行,细表会自动级联删除,当然还有别的关联数据,那个不用管,反正是测试库,咋折腾都行,只要让报表呈现符合预期就好)。为了让明细数据显得更自然,当然不能简单粗暴的把一段连续时期内的单据统统删除,或者把大量单据的折扣改低以符合目标,那样太粗暴,弄巧成拙就不好了。
我设想的是,按一定时间粒度(如日、周、月、季度)划分单据,然后从每个区间内查出一定比例的单据,然后与目标比对,根据比对情况逐步调整粒度与比例,直至符合目标为止。这样就得到了需要保留的单据,剩下就是把查询区间内的其余单据删除即可。当然也可以将当前数据与目标数据相减,得到需要砍掉的数据,完了以该数据作为目标来查询单据,这样就能直接得到需要删除的单据。我采用的是前一种,即得到需要保留的单据,完了也就一个where not in的事,不费力。上代码:
WITH cte AS ( --按一定时间粒度分组(日、周、月、季度等)
SELECT ROW_NUMBER() OVER(PARTITION BY DATEPART(week, 单据日期) ORDER BY 单据编号) AS 'RowNo'
,DATEPART(week, 单据日期) AS 'Rang', 单据日期, 单据编号, 成交金额
FROM 主单表
WHERE 营业点='xxx'
AND YEAR(单据日期)=2015
),cte2 AS ( --得到每组的单据数,作为分母
SELECT Rang,COUNT(1) AS 'BillCount' FROM cte GROUP BY Rang
)
SELECT a.*,BillCount
FROM cte a
JOIN cte2 b ON b.Rang = a.Rang
WHERE RowNo/CAST(BillCount AS DECIMAL(16,4)) < 0.81 --按比例取每组的部分行,billcount是int,需转换为小数再除
时间粒度就修改datepart函数的第1个参数(day/week/month/quarter等),注意有2处,比例就修改最后那个0.81,很简单,说一下都多余。
我的环境是SQL08R2,如果有更正确的姿势,还望大侠提点,感谢。
【T-SQL】分布抽取部分数据的更多相关文章
- 数据透视表sql:用SQL行列转换实现数据透视的一些思考
用SQL行列转换实现数据透视的一些思考 摘要:根据对报表开发过程中碰到的需要用SQL行列转换进行解决的一类查询统计问题的分析,逐步探索求解得到一种较通用的解决思路,并用函数进行实现.该解决思路及函数实 ...
- mybatis动态sql中的sql标签——抽取可重用的sql片段
1.用<sql>标签抽取可重用的sql片段 <!-- 抽取可重用的SQL片段,方便后面引用 1.sql抽取,经常将要查询的列名,或者插入用的列名,之后方便引用 ...
- 使用Kettle增量抽取MongoDB数据实践
需求: 增量抽取MongoDB数据并加载到MSSQL 由于不能使用关系型数据库的自定义SQL, 所以主要遇到的问题有: 增量时间的查询和参数控制 ETL的批次信息和调用参数的写入 第一个问题的解决如下 ...
- 数据治理中Oracle SQL和存储过程的数据血缘分析
数据治理中Oracle SQL和存储过程的数据血缘分析 数据治理中的一个重要基础工作是分析组织中数据的血缘关系.有了完整的数据血缘关系,我们可以用它进行数据溯源.表和字段变更的影响分析.数据合规性 ...
- 利用SQl对数据库实行数据拆分与组合
利用SQl对数据库实行数据拆分与组合实现提供以下几种方案: 方法一: WITH CTE AS (SELECT A.Id,A.[Uid],UserName FROM (SELECT A.[id], RE ...
- Sql Server系列:数据表操作
表是用来存储数据和操作数据的逻辑结构,用来组织和存储数据,关系数据库中的所有数据都表现为表的形式,数据表由行和列组成.SQL Server中的数据表分为临时表和永久表,临时表存储在tempdb系统数据 ...
- 一个有趣的SQL Server 层级汇总数据问题
看SQL Server大V宋大侠的博客文章,发现了一个有趣的sql server层级汇总数据问题. 具体的问题如下: parent_id emp_id emp_nam ...
- sql server 随机读取数据
--sql server 随机读取数据 * FROM [tablename] ORDER BY NEWID() pk from [tablename] ORDER BY NEWID()) --这两个方 ...
- 如何用SQL语句查询Excel数据?
如何用SQL语句查询Excel数据?Q:如何用SQL语句查询Excel数据? A:下列语句可在SQL SERVER中查询Excel工作表中的数据. 2007和2010版本: SELECT*FROMOp ...
随机推荐
- (翻译)《Hands-on Node.js》—— Introduction
今天开始会和大熊君{{bb}}一起着手翻译node的系列外文书籍,大熊负责翻译<Node.js IN ACTION>一书,而我暂时负责翻译这本<Hands-on Node.js> ...
- 【HTML5】Web Audio API打造超炫的音乐可视化效果
HTML5真是太多炫酷的东西了,其中Web Audio API算一个,琢磨着弄了个音乐可视化的demo,先上效果图: 项目演示:别说话,点我! 源码已经挂到github上了,有兴趣的同学也可以去st ...
- android-plugmgr源代码分析
android-plugmgr是一个Android插件加载框架,它最大的特点就是对插件不需要进行任何约束.关于这个类库的介绍见作者博客,市面上也有一些插件加载框架,但是感觉没有这个好.在这篇文章中,我 ...
- 记录Office Add-in开发经验
原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com 得益于微软系强大的共通能力和Visual Studio的开发支持,做Office插件不是什么难事.一点经验记录如下 ...
- quick-cocos2d-x 2.2.3 rc版本中 crypto.md5file() 的C++实现在ANDROID上有BUG
原来的版本是用fopen打开文件的,如果要从ANDROID的APK中取文件,直接就洗白了修改如下 void CCCrypto::MD5File(const char* path, unsigned c ...
- ASP.NET Web API路由系统:Web Host下的URL路由
ASP.NET Web API提供了一个独立于执行环境的抽象化的HTTP请求处理管道,而ASP.NET Web API自身的路由系统也不依赖于ASP.NET路由系统,所以它可以采用不同的寄宿方式运行于 ...
- java IO流 之 字符流
字符是我们能读懂的一些文字和符号,但在计算机中存储的却是我们看不懂的byte 字节,那这就存在关于字符编码解码的问题.所以在学习Io流的字符流前我们先了解些关于编码问题. 一.字符集与字符编码 1.什 ...
- Ado.Net Destination 用法
Ado Net Destination Component 使用Ado net Connection manager,其Data Access Mode 只有一种, table or view,组件的 ...
- javascript面向对象系列第三篇——实现继承的3种形式
× 目录 [1]原型继承 [2]伪类继承 [3]组合继承 前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承.本文是javascript面向对象系列第三篇——实现继承的3种形式 [ ...
- 快速搭建php环境
WAMP:在windows系统下搭建PHP开发环境 APPSERVER: 两种可用于开发环境的,一般用WAMP LAMP构架 Linux系统 Apache服务器管理软件 Mysql数据库 php语言 ...