一张表PvTable简化后的字段如下
DATEID INT 类型 格式如 20090204
Pv INT 类型 表示这一天的浏览量
由于应用中总是需要计算今天比前一天的增长量,所以我要在表上加一个字段
PvInc FLOAT 类型 表示今天比昨天的增长量
请教,我如何用一个sql初始化以前的数据的PvInc的值?
谢谢。
写一个SP执行一下就行了吧,我做的话要用到游标。还有就是DATEID 是否会缺失和唯一楼主没有交待。
一,只是提供个思路供你参考:
当然用存储过程是比较好的思路,这里只提供SQL的实现,关键是自表连接语句
1 建立临时表
2 自表连接,筛选出需要的记录存入临时表
3 删除原来表中的所有记录
4 插入临时表的数据到表中
二,代码实现
测试数据
DATEID Pv PvInc
20090501 100 NULL
20090502 110 NULL
20090503 120 NULL
20090504 80 NULL
//临时表
DECLARE @tempPvTavle TABLE
(
DATEID1 INT,
Pv1 INT,
DATEID2 INT,
Pv2 INT,
PvInc FLOAT
)
//插数据到临时表
INSERT INTO @tempPvTavle
SELECT p1.DATEID
,p1.Pv
,p2.DATEID
,p2.Pv
,p1.pv/CAST(p2.pv AS FLOAT) PvInc
FROM pvTable p1 JOIN pvTable p2
ON p1.DATEID <> p2.DATEID
--where语句有待完善,月未和次月月首日无法判断
--需要转换为日期类型(先转换为字符再转换为日期类型)
WHERE p1.DATEID = p2.DATEID + 1
AND PvInc IS NULL
ORDER BY p1.DATEID
--删除原来表中的数据
DELETE FROM PvTable WHERE PvInc IS NULL
--插入数据
----第一条记录(DATEID:20090501)
INSERT INTO PvTable
SELECT TOP 1 DATEID2,Pv2,0
FROM @tempPvTavle
----剩下的记录
INSERT INTO PvTable
SELECT DATEID1,Pv1,PvInc
FROM @tempPvTavle
补充表连接选出的数据
20090502 110 20090501 100
20090503 120 20090502 110
20090504 90 20090503 120
方法比较笨,不知能否解决你的问题?
mark
你可以新建一个自增长的列,比如自增字段叫做“order”。 然后执行这句就可以了: UPDATE PvTable SET PvInc=( SELECT TOP 1 t1.Pv-t2.Pv FROM PvTable AS t2 WHERE t2.order<t1.order ORDER BY t2.order DESC ) FROM PvTable AS t1 WHERE t1.ORDER>1 -- 排除第一条记录 括号里的语句可以换成: SELECT t1.Pv-t2.Pv FROM pvTable AS t2 WHERE t2.order=t1.order-1 执行完后把自增字段删除,并手动把第一条记录的PvInc设置为0 注:正常来说你表里的记录应该是按照时间先后有序的。如果特别,不是有序的,那你就先排序一下,然后再建自增字段。
update pvTable set a.PvInc = a.Pv-isnull(b.Pv,0) From pvTable a left join pvTable b on convert(datetime,convert(char(10),a.dateid))-1 = convert(datetime,convert(char(10),b.Dateid)
很方便。
dateid 的前一天是 convert(datetime,convert(char(10),a.dateid))-1
用左关联找出来一减就出来的它的增长量。没找到的本身就是增量了。