1

以下の表の要件があります。

条件:

  1. クライアントの生年月日が3日間連続している場合は、給与クライアントの平均をとる必要があります。
  2. クライアント間のギャップの間に最も近い3日間のドブのギャップがない場合は、そのクライアントを考慮する必要はありません。

例:
以下の表で、
クライアント17には以前のclientidのWITHシリアルdobがあり、1日ギャップがあります->この場合、15、16、および17の給与を取得して17の給与AVGを取得します。
クライアント18には、以前のclientidのWITHシリアルdobがあります->この場合、16、17、および18の給与を受け取ることにより、18の給与AVGを取得します。

テーブル:

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)

いくつかのmessupの結果を与える以下のクエリ。

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から過去3日間の行が取得されることです。これには、テスト中の現在の行が含まれるため、二重加算は必要ありません。また、˙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

あなたはここであなたの最後のデータでそれを見ることができます

于 2012-08-23T14:09:40.967 に答える
2

次のクエリは、先行する3つのレコードのそれぞれに結合します。結合は、データを取り込み、フィルターとして機能して、次の3つがあることを確認します。

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 に答える