有张价格表:
自增ID, 商品ID, 价格录入时间, 价格(人民币)
ID_bigint ProductKeyID_nvarchar CreateTime_datetime StandardRMB_money
1 A000000001 2008-10-11 12:30:00 6.83
2 A000000002 2008-10-12 12:31:00 1.83
3 A000000007 2008-10-15 12:33:00 2.44
4 A000000004 2008-10-17 18:30:00 5.50
5 A000000008 2008-11-20 08:30:00 2.02
6 A000000001 2008-12-11 17:02:00 100.03
7 A000000002 2008-10-11 19:55:00 1025.83
8 A000000003 2009-01-08 16:25:00 25.83
9 A000000003 2009-02-18 12:55:00 24.80
10 A000000003 2009-07-05 11:05:00 20.99
...
...
记录数有100多万数据。
现在要查的数据是
我指定 一个时间段 例如: 2008-12-21 到2009-7-01
要查这个时间段内的产品价格。
如果没有价格则按照以前的价格计算。例如:A000000008 它的价格应该是 2008年11月20号的价格.
如果这个时间段有多个价格的话,求平均值。例如:A000000003 它的价格就应该是(25.83+24.80)/2
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
分两步:
select ProductKeyID,avg(StandardRMB) from tt group by ProductKeyID
where convert(char(10), CreateTime,120) between '2008-12-21' and '2009-7-01'
select a.* from tt inner join
(select ProductKeyID,max(CreateTime) as ma
where convert(char(10), CreateTime,120)<'2008-12-21'
group by ProductKeyID) on
a.ProductKeyID=b.ProductKeyID and a.CreateTime=b.ma
将两个结果连接,如果结果1中已经有的ProductKeyID,结果2中就应该去掉
------解决方案--------------------------------------------------------
select ProductKeyID,avg(StandardRMB) from tt group by ProductKeyID
GROUP BY ProductKeyID
where convert(char(10), CreateTime,120) between '2008-12-21' and '2009-7-01'
UNION ALL
SELECT * FROM (
select a.* from tt A inner join
(select ProductKeyID,max(CreateTime) as ma
where convert(char(10), CreateTime,120) <'2008-12-21'
group by ProductKeyID) B on
a.ProductKeyID=b.ProductKeyID and a.CreateTime=b.ma) C
WHERE ProductKeyID NOT IN
(select ProductKeyID from tt
where convert(char(10), CreateTime,120) between '2008-12-21' and '2009-7-01' )
------解决方案--------------------------------------------------------
不过我的创建时间本来就是日期格式的不用Convert可以吗?
你的是日期时间型,要取所月日要转换一下
还有分两步其实一步可以实现吧:
不是,因为你要求
如果在日期中,则平均
否则,取<指定日期的记录中最大日期对应的StandardRMB