第一列是对goodsid局部分的规定,并按照升序audittime到分组后得到的记录的序号
排序,从而
显示出商品的几次变化。
第二列在新价格的商品价格的变化,然后将这种价值的其他商品,如goodsid 1,最后的新价格是20,那么所有goodsid curprice 1书面记录为20,从而达到
控制外分布的
影响。
如下,对正常数据记录进行比较。
需要添加特殊的两列效应:
以前的
方法是在正常记录C #
服务器取出(根据goodsid和audittime,然后拿到订单)的整个数据集的遍历,两个新栏目,
解决expandfield价值问题的第一个周期,与最后的价格新巧妙的记录的关键,第二周期是关键的价格新记录被分配到同一goodsid curprice。代码如下:
复制代码代码如下所示:
private void changedatatable(DataTable dt)
{
Dt.Columns.Add(curprice );
Dt.Columns.Add(expandfield );
国际goodsid = 0;
int索引= 1; /指针
小数curprice = 0;
ihashobject curpriceobj =新(hashobject); / /关键
增加分配
foreach(DataRow排在DT。行){
如果(goodsid!= convert.toint32(行{goodsid ))){
Curpriceobj.Add (goodsid_ +goodsid, curprice);
治疗
索引= 0;
goodsid = convert.toint32(行{goodsid ));
}
curprice = convert.todecimal(行{新价格));
索引= 1;
行{expandfield=第一+指数+次生变化;
}
如果(dt.rows.count!= 0)在最后商品上添加当前价格
curpriceobj。添加(goodsid_ + goodsid,curprice);
}
目前的价格上涨/
foreach(DataRow排在DT。行){
行{curprice} =goodsid_curpriceobj { +排{goodsid ;
}
}
但现在存储过程必须
报告分页、排序和分页的
支持,如果按照新价格的客户最新的价格要求排序,它是明确的,服务器的数据
转换的源不支持(因为数据源分页数据库在这方面并没有新价格)。
此外,在C #服务器
处理,它实际上占用的
内存。一对DataTable横贯两次。此外,它还将临时键值用于对象。重复分配是
性能消耗。
总之,我最终选择将它放在数据库中来构建这两个列。
关于第一列部分排序,我很快想到了一个以前看过的语法row_number()在(分区…
顺序),所以第一列expandfield很容易建立,SQL如下:
复制代码代码如下所示:
选择S+投(row_number()在(由goodsid顺序audittime DESC分区)=(10))+子过渡,
goodsid,价格,折扣,新价格,begindate为{日}
从#试验
但真正的麻烦是其次,我破碎的头骨,想不想出来,甚至使用临时表记录结果的思想,然后用光标遍历结果集,
修改记录更新的表,但仍然觉得很麻烦,而且效果不佳。后来,我问
公司的DBA,她给了一种思维方式,它是在效率和可行性方面最好的。首先,代码如下:
复制代码代码如下所示:
与_temp(如
选择row_number()在(由goodsid顺序audittime DESC分区)为num2,
在row_number()(由goodsid顺序audittime分区)为民,
goodsid,价格,折扣,新价格,begindate为{日}
从#试验
)
选择S+投(a.num为varchar(10))+次转移expandfield,
A.goodsid,a.price,a.discount,a.newprice,a.date,b.newprice作为curprice
从_temp一
内部联接_temp B a.goodsid = b.goodsid和b.num2 = 1
这里的自我
关联查询CTE的表达,从性能上,是一个很大的优势,相对于临时表来减少tempdb的开销,代码的可读性也比嵌套查询更强,num列用于更改列的勾建迪几次,这里很巧妙地加入了根据audittime num2列的序列在临时记录B通过指定b.num2 = 1得到所有的goodsid最后的改变由内加入记录得到我们想要的curprice值。
此外,如果在多个列上有排序字段,则SQL将选择后者来重新排列。首先,新闻goodsid组,然后安排audittime升序排列在不同的组。如果num是摆在面前,num2不会得到我们想要的记录。