前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【T-SQL】分布抽取部分数据

【T-SQL】分布抽取部分数据

作者头像
AhDung
发布2018-09-13 11:21:36
7430
发布2018-09-13 11:21:36
举报
文章被收录于专栏:AhDungAhDung

好吧,我确实不知道该怎么起这个标题,整了一个“分布”,感觉还有点高档,其实没啥技术含量,看完你就知道了。情况是这样,刚刚接到一个临时任务,需要让几个营业点的销售数据【变】少一点,就是在ERP的相关报表中,查询出来的数据要在指定区间,说白了就是那什么~你懂的,某些同行应该对这种任务很熟悉了,而有些同行可能正在或即将面临这样的任务,希望此文能提供一点思路。

我是第一次接到这种任务,感觉蛮新鲜,思量一下,决定在测试库动手脚,完了让他的ERP接入测试库,事情过后再切回正式库,细枝末节就不说了,重点说一下数据处理方法。根本原理是删除部分单据,因为报表的数据是从单据来的,单据少了,自然数字就小了(至于单据数据结构,不同的ERP方案当然有不同的设计,删除一张单涉及的数据修改也不同,我的情况是直接删除主单就行,细表会自动级联删除,当然还有别的关联数据,那个不用管,反正是测试库,咋折腾都行,只要让报表呈现符合预期就好)。为了让明细数据显得更自然,当然不能简单粗暴的把一段连续时期内的单据统统删除,或者把大量单据的折扣改低以符合目标,那样太粗暴,弄巧成拙就不好了。

我设想的是,按一定时间粒度(如日、周、月、季度)划分单据,然后从每个区间内查出一定比例的单据,然后与目标比对,根据比对情况逐步调整粒度与比例,直至符合目标为止。这样就得到了需要保留的单据,剩下就是把查询区间内的其余单据删除即可。当然也可以将当前数据与目标数据相减,得到需要砍掉的数据,完了以该数据作为目标来查询单据,这样就能直接得到需要删除的单据。我采用的是前一种,即得到需要保留的单据,完了也就一个where not in的事,不费力。上代码:

代码语言:javascript
复制
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,如果有更正确的姿势,还望大侠提点,感谢。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-01-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云 BI
腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档