发布网友 发布时间:2022-04-08 18:46
共6个回答
懂视网 时间:2022-04-08 23:07
。为了让明细数据显得更自然,当然不能简单粗暴的把一段连续时期内的单据统统删除,或者把大量单据的折扣改低以符合目标,那样太粗暴,弄巧成拙就不好了。我设想的是,按一定时间粒度(如日、周、月、季度)划分单据,然后从每个区间内查出一定比例的单据,然后与目标比对,根据比对情况逐步调整粒度与比例,直至符合目标为止。这样就得到了需要保留的单据,剩下就是把查询区间内的其余单据删除即可。当然也可以将当前数据与目标数据相减,得到需要砍掉的数据,完了以该数据作为目标来查询单据,这样就能直接得到需要删除的单据。我采用的是前一种,即得到需要保留的单据,完了也就一个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】分布抽取部分数据
标签:
热心网友 时间:2022-04-08 20:15
如果只是固定取"20/30"比较容易, 只需找到"20/30"在此字符串的开始位置,再截取5个字符的长度就可以了,如:热心网友 时间:2022-04-08 21:33
SUBSTRING热心网友 时间:2022-04-08 23:08
一楼的是固定长度的热心网友 时间:2022-04-09 00:59
如果/能够保证在字段中唯一出现的话可以:热心网友 时间:2022-04-09 03:07
select substring('mgdf13hj44jjjgasetrxzc20/30nj5weyu45f5645gjhkdfjkg',23,5)