日期:2014-05-18  浏览次数:20535 次

一道比较难的查询问题
有table结构如下,日期datetim型,姓名VARCHAR型,数量int型.
  日期                         姓名               数量
2007-05-12       张三                     3
2007-05-16       张三                     3
2007-05-18       张三                     5
2007-05-20       张三                   10
2007-05-13       李四                   11
2007-05-17       李四                   12
2007-05-18       李四                   13
2007-05-19       李四                   15
2007-05-12       小王                   12
2007-05-11       小王                   13
2007-05-17       小王                   14
2007-05-19       小王                   15

要求显示所有人的:

离当前时间最近3次记录的平均间隔时间                 姓名                     平均数量
DATEDIFF(day,2007-05-16,max(日期))/3           张三                         6
DATEDIFF(day,2007-05-17,max(日期))/3           李四                         13.3
DATEDIFF(day,2007-05-11,max(日期))/3           小王                         14  

我只写出了所有记录的平均时间:
select   DATEDIFF(day,min(日期),max(日期))/count(姓名),姓名,avg(数量)   from     table     group   by   姓名

如何获取离现在最近的第3次记录不知道怎么求,请教各位大侠了.


------解决方案--------------------
SELECT uName,AVG(uNum)
FROM tb a
WHERE 3>
(
SELECT COUNT(*) FROM tb WHERE uName=a.uName
AND ABS(DATEDIFF(dd,fDate,GETDATE()))
<ABS(DATEDIFF(dd,a.fDate,GETDATE()))
)
GRUOP BY uName

随手敲的,可能有手误
------解决方案--------------------
select [离当前时间最近3次记录的平均间隔时间]=DATEDIFF(day,min(日期),max(日期))/3,姓名,平均数量=ltrim(str(avg(cast(数量 as decimal)),10,1)) from
(
select 日期, 姓名,数量 from test a where 日期 in
(
select top 3 日期 from test where 姓名=a.姓名 order by 日期 desc
)
)b
group by 姓名
------解决方案--------------------
多写了一层嵌套,改下
select DATEDIFF(day,min(日期),max(日期))/3, 姓名,平均数量=ltrim(str(avg(cast(数量 as decimal)),10,1)) from test a where 日期 in
(
select top 3 日期 from test where 姓名=a.姓名 order by 日期 desc
)
group by 姓名
------解决方案--------------------
select tname,sum(num) from tb a where tdate in ( select top 3 tdate from tb where tname=a.tname order by tdate desc)
group by tname