首页 新闻 会员 周边

计算增长量的sql如何写?

0
悬赏园豆:30 [已关闭问题]

一张表PvTable简化后的字段如下

DATEID INT 类型 格式如 20090204

Pv INT 类型 表示这一天的浏览量

由于应用中总是需要计算今天比前一天的增长量,所以我要在表上加一个字段

PvInc FLOAT 类型 表示今天比昨天的增长量

请教,我如何用一个sql初始化以前的数据的PvInc的值?

谢谢。

问题补充: DATEID 是日期的年月日部分的整数,是唯一的,但是有可能会有缺失,例如在按周统计时,DATEID就是每周周一的日期。 谢谢两位热心的答复,希望有比用游标和临时表更好的答案。
玉开的主页 玉开 | 大侠五级 | 园豆:8822
提问于:2009-05-15 10:04
< >
分享
其他回答(4)
0

写一个SP执行一下就行了吧,我做的话要用到游标。还有就是DATEID 是否会缺失和唯一楼主没有交待。

风海迷沙 | 园豆:4453 (老鸟四级) | 2009-05-15 11:52
0

一,只是提供个思路供你参考:

当然用存储过程是比较好的思路,这里只提供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

方法比较笨,不知能否解决你的问题?

HA-LOU | 园豆:192 (初学一级) | 2009-05-15 12:07
0

mark

yearN | 园豆:551 (小虾三级) | 2009-05-15 19:19
0

 你可以新建一个自增长的列,比如自增字段叫做“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

注:正常来说你表里的记录应该是按照时间先后有序的。如果特别,不是有序的,那你就先排序一下,然后再建自增字段。

Hunts.C | 园豆:266 (菜鸟二级) | 2009-05-19 20:34
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

用左关联找出来一减就出来的它的增长量。没找到的本身就是增量了。

hlake | 园豆:225 (菜鸟二级) | 2009-05-19 22:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册