【100分】有一定难度的分组筛选查询问题,高手速来围观帮忙啊!!!!

丰云 2014-05-07 05:40:35

srcData--复杂查询得到的数据,所以不要说下面数据结构不合理
-------------------------------------------------------------------------------------
id ProductId StockNum EnterTime enterNum
12 100003 22 2014-04-28 00:00:00 10
23 100003 22 2014-04-27 00:00:00 5
41 100003 22 2014-04-25 00:00:00 18
56 100003 22 2014-04-21 00:00:00 10
64 100003 22 2014-04-19 00:00:00 8
75 100003 22 2014-04-13 00:00:00 10
97 100003 22 2014-04-07 00:00:00 5
132 100006 45 2014-05-02 00:00:00 20
163 100006 45 2014-04-28 00:00:00 15
231 100006 45 2014-04-24 00:00:00 5
468 100006 45 2014-04-23 00:00:00 5
532 100006 45 2014-04-20 00:00:00 10
562 100006 45 2014-04-19 00:00:00 15
644 100006 45 2014-04-16 00:00:00 10
687 100006 45 2014-04-15 00:00:00 5
763 100008 12 2014-04-17 00:00:00 5
796 100008 12 2014-04-15 00:00:00 10
803 100008 12 2014-04-15 00:00:00 5
825 100008 12 2014-04-11 00:00:00 15
846 100008 12 2014-04-09 00:00:00 10
867 100008 12 2014-04-02 00:00:00 5

--需要得到的数据
--------------------------------------------------------------------------------------------
id ProductId StockNum EnterTime enterNum
12 100003 22 2014-04-28 00:00:00 10
23 100003 22 2014-04-27 00:00:00 5
41 100003 22 2014-04-25 00:00:00 18
132 100006 45 2014-05-02 00:00:00 20
163 100006 45 2014-04-28 00:00:00 15
231 100006 45 2014-04-24 00:00:00 5
458 100006 45 2014-04-23 00:00:00 5
763 100008 12 2014-04-17 00:00:00 5
796 100008 12 2014-04-15 00:00:00 10

--规则是,根据ProductId分组,按时间降序排列,依次累加入库数量,
--如果达到或超出库存数量,则停止,丢掉之后的数据,开始查找下一个分组
--求高手赐教

...全文
111 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
丰云 2014-05-08
  • 打赏
  • 举报
回复
引用 5 楼 spiritofdragon 的回复:
一楼正确的前提,是ID的单调性跟EnterTime单调性正好相反。当然一般数据表都这样,但不然有漏补数据就不一定满足单调性了。所以最好用EnterTime排序。
是的,我这里的源数据是查询得来的,可以用over()来确保id的单调性,非常感谢你的提醒
spiritofdragon 2014-05-07
  • 打赏
  • 举报
回复
一楼正确的前提,是ID的单调性跟EnterTime单调性正好相反。当然一般数据表都这样,但不然有漏补数据就不一定满足单调性了。所以最好用EnterTime排序。
丰云 2014-05-07
  • 打赏
  • 举报
回复
一楼给的答案是正确的,我刚跟同事讨论的方法,原理跟一楼给的也是一样的,谢谢大家!!
丰云 2014-05-07
  • 打赏
  • 举报
回复
引用 2 楼 spiritofdragon 的回复:
一个需求问题? 12 100003 22 2014-04-28 00:00:00 10 23 100003 22 2014-04-27 00:00:00 5 41 100003 22 2014-04-25 00:00:00 18 10+5+18〉22了,是不是应该改成 10+5+7 ? 我是怕,写出10、5、18不是你的需求。还得改。 你是想要 10、5、7还是10、5、18
其实我的说明里已经说清楚了,大于等于都行,一定要严格按时间降序来,所以我需要的是10,5,18
spiritofdragon 2014-05-07
  • 打赏
  • 举报
回复
一个需求问题? 12 100003 22 2014-04-28 00:00:00 10 23 100003 22 2014-04-27 00:00:00 5 41 100003 22 2014-04-25 00:00:00 18 10+5+18〉22了,是不是应该改成 10+5+7 ? 我是怕,写出10、5、18不是你的需求。还得改。 你是想要 10、5、7还是10、5、18
哥眼神纯洁不 2014-05-07
  • 打赏
  • 举报
回复

with a(id,ProductId,StockNum,EnterTime,enterNum)as(
select 12,100003,22,'2014-04-28 00:00:00',10 union
select 23,100003,22,'2014-04-27 00:00:00',5 union
select 41,100003,22,'2014-04-25 00:00:00',18 union
select 56,100003,22,'2014-04-21 00:00:00',10 union
select 64,100003,22,'2014-04-19 00:00:00',8 union
select 75,100003,22,'2014-04-13 00:00:00',10 union
select 97,100003,22,'2014-04-07 00:00:00',5 union
select 132,100006,45,'2014-05-02 00:00:00',20 union
select 163,100006,45,'2014-04-28 00:00:00',15 union
select 231,100006,45,'2014-04-24 00:00:00',5 union
select 468,100006,45,'2014-04-23 00:00:00',5 union
select 532,100006,45,'2014-04-20 00:00:00',10 union
select 562,100006,45,'2014-04-19 00:00:00',15 union
select 644,100006,45,'2014-04-16 00:00:00',10 union
select 687,100006,45,'2014-04-15 00:00:00',5 union
select 763,100008,12,'2014-04-17 00:00:00',5 union
select 796,100008,12,'2014-04-15 00:00:00',10 union 
select 803,100008,12,'2014-04-15 00:00:00',5 union
select 825,100008,12,'2014-04-11 00:00:00',15 union
select 846,100008,12,'2014-04-09 00:00:00',10 union
select 867,100008,12,'2014-04-02 00:00:00',5)
, b as(
select *
,(select SUM(enternum) from a where b.ProductId=ProductId and id<=b.id )sum from a b)
, c as(select * from b b1
where id=(select MIN(id) from b where b1.ProductId=ProductId and sum>=StockNum)
)
select * from a
where exists(select 1 from c where a.ProductId=ProductId and a.id<=id)
试试

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧