1

我有一个下表的要求。

条件:

  1. 如果客户有连续3天的出生日期差距,我必须取客户的平均工资。
  2. 如果客户之间的差距没有最近的 3 天出生日期差距,则无需考虑该客户。

示例:
在下表中,
客户端 17 具有以前的客户端 ID 的 WITH 串行 dob,间隔为 1 天 -> 在这种情况下,我将通过 15,16 和 17 的薪水获得 17 的平均工资。
客户 18 有以前的客户 ID,带有连续的出生日期 -> 在这种情况下,我将通过 16,17 和 18 的工资获得 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 

请帮忙。

先感谢您!

4

3 回答 3

3

您可以试试这个 - 不同之处在于,从 t2 获取前三天的行,其中包括正在测试的当前行,因此不需要双重求和。此外 ˙have` 删除仅引用自身的行。

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

您可以在此处查看您最后的数据

于 2012-08-23T14:09:40.967 回答
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

你的问题似乎很奇怪。为什么日期必须是连续的,为什么它们都必须在那里?如果有多个人在同一日期和职位上会发生什么?

于 2012-08-23T13:28:54.043 回答
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 
于 2012-08-23T13:28:13.180 回答