我对下表有要求。
条件:
例:
在下表中
客户端17具有先前的clientid的WITH serial dob,其中1天的间隙 - >在这种情况下,我将以15,16& 17个工资
客户18具有以前的clientid的WITH serial dob's - >在这种情况下,我将以16,17& 18个薪水。
表:
JobType ClientID ClinetDOB's Slaries
.net 1 2012-03-14 300
.net 2 2012-04-11 400
.net 3 2012-04-12 200
.net 4 2012-07-29 400
.net 5 2012-08-17 1200
.net 6 2012-08-18 1400
.net 7 2012-08-19 1400
java 8 2012-04-10 400
java 9 2012-07-29 400
java 10 2012-07-30 600
java 11 2012-08-14 1200
java 12 2012-08-15 1800
java 13 2012-08-16 1100
java 14 2012-09-17 1200
java 15 2012-08-18 2400
java 16 2012-08-19 2400
java 17 2012-08-20 2400
java 18 2012-08-21 1500
结果应该看起来像这样: -
JobType ClientID ClinetDOB's AVG(Slaries)
.net 7 2012-08-19 1333
Java 13 2012-08-16 1366 --This avg of 5,6,7 clientsId's(because they have serial 3days dob's)
Java 17 2012-08-20 2400 --This avg of 15,16,17 clientsId's(because they have serial 3days dob's)
Java 18 2012-08-21 2100 --This avg of 16,17,18 clientsId's(because they have serial 3days dob's)
下面的查询给出一些搞乱结果。
select t1.ClientID,
t1.ClinetDOBs,
(t1.Slaries + sum (t2.Slaries)) / (count (*) + 1) Avg_Slaries
from table1 t1
inner join table1 t2
on (t1.ClinetDOBs = dateadd(day, 3, t2.ClinetDOBs) and t1.jobtype = t2.jobtype)
group by t1.ClientID,
t1.ClinetDOBs,
t1.Slaries
请帮忙。
提前谢谢!
答案 0 :(得分:3)
您可以尝试这一点 - 区别在于从t2开始是从前三天开始的行,其中包括正在测试的当前行,因此不需要进行双重求和。另外˙having`删除仅引用自己的行。
select t1.ClientID,
t1.ClinetDOBs,
avg(t2.Slaries) Avg_Slaries
from table1 t1
inner join table1 t2
on t1.ClinetDOBs >= t2.ClinetDOBs
and t1.ClinetDOBs <= dateadd(day, 3, t2.ClinetDOBs)
and t1.jobtype = t2.jobtype
group by t1.ClientID,
t1.ClinetDOBs
having count(*) > 1
答案 1 :(得分:2)
以下查询连接前三个记录中的每一个。连接都引入数据并充当过滤器以确保有三个:
select tmain.ClientID, tmain.ClinetDOBs,
sum(tmain.slaries + t1.slaries + t2.slaries)/3.0 as avg_slaries
from table1 tmain join
table1 t1
on t1.ClinetDOBs = dateadd(day, -1, tmain.ClinetDOBs) and
t1.jobtype = tmain.jobtype join
table t2
on t2.ClinetDOBs = dateadd(day, -2, tmain.ClinetDOBs) and
t2.jobtype = tmain.jobtype
group by tmain.ClientID, tmain.ClinetDOBs, tmain.Slaries
你的问题似乎很奇怪。为什么日期必须是连续的,为什么它们都必须在那里?如果同一日期和职位上有多个人会怎么样?
答案 2 :(得分:1)
尝试
select t1.ClientID,
t1.ClinetDOBs,
avg(t2.Slaries)
from table1 t1
inner join table1 t2
on t2.ClinetDOBs >= t1.ClinetDOBs)
t2.ClinetDOBs <= dateadd(day, 3, t1.ClinetDOBs)
and t1.jobtype = t2.jobtype
group by t1.ClientID,
t1.ClinetDOBs