sql - How to find the average value for consecutive zeros? -


this table.

site_name | date& time              | poweroutput          ----------+-------------------------+------------------ act0001   | 2013-07-21 01:00:00.000 | 196.852984494331   act0001   | 2013-07-21 02:00:00.000 | 0    xyz0001   | 2013-07-21 03:00:00.000 | 196.852984494331    xyq0001   | 2013-07-21 04:00:00.000 | 196.958395639561  xys0001   | 2013-07-21 05:00:00.000 | 0 xyd0001   | 2013-07-21 06:00:00.000 | 197.20098185022  xye0001   | 2013-07-21 07:00:00.000 | 0  xyg0001   | 2013-07-21 08:00:00.000 | 0      cfg0001   | 2013-07-21 09:00:00.000 | 197.412144323522  acb0001   | 2013-07-21 10:00:00.000 | 0  bdf0001   | 2013-07-21 11:00:00.000 | 0  olk0001   | 2013-07-21 12:00:00.000 | 196.886233049016  

i trying update values in places of zeros. if there 1 0 able update table, if there consecutive zeros finding difficult update table.

the logic :

((previous value-next value)/previous value)*100 <5 

if true should insert previous value

((previous value-next value)/previous value)*100 >=5 

if true should remain zero.

this code have far:

;with cte (     select           *,         lead(pr_output,1) on (order (select null)) previousvalue,         lag(pr_output,1) on (order (select null)) nextvalue             [dbo].[my_table] ) ,ctee (     select          *,         abs((previousvalue*100-nextvalue*100)/(case when nextvalue = 0 1 else nextvalue end)) checkflag             cte  ) select     site_name,[date&time],     case          when pr_output <>0 pr_output         else             case                  when checkflag >= 5 0                 else previousvalue             end     end pr_output      ctee  

i unable update records in case of consecutive zeros.

expected output:

site_name | date& time              | poweroutput          ----------+-------------------------+------------------ act0001   | 2013-07-21 01:00:00.000 | 196.852984494331   act0001   | 2013-07-21 02:00:00.000 | 196.852984494331    xyz0001   | 2013-07-21 03:00:00.000 | 196.852984494331    xyq0001   | 2013-07-21 04:00:00.000 | 196.958395639561  xys0001   | 2013-07-21 05:00:00.000 | 196.958395639561 xyd0001   | 2013-07-21 06:00:00.000 | 197.20098185022  xye0001   | 2013-07-21 07:00:00.000 | 197.20098185022  xyg0001   | 2013-07-21 08:00:00.000 | 197.20098185022    cfg0001   | 2013-07-21 09:00:00.000 | 197.412144323522  acb0001   | 2013-07-21 10:00:00.000 | 197.412144323522 bdf0001   | 2013-07-21 11:00:00.000 | 197.412144323522 olk0001   | 2013-07-21 12:00:00.000 | 196.886233049016  

thank you

if you're trying replace 0 values in poweroutput recent previous non-zero poweroutput value in cases where:

((previous value-next value)/previous value)*100 <5 

then believe trick:

select  main.sitename,         main.[datetime],         case when main.poweroutput = 0              case when ((previousnonzero.poweroutput - nextnonzero.poweroutput) / previousnonzero.poweroutput) * 100 < 5                     previousnonzero.poweroutput                     else 0                  end             else main.poweroutput         end poweroutput [dbo].[my_table] main outer apply (     select top 1 poweroutput      [dbo].[my_table] prev      prev.[datetime] < main.[datetime]     , poweroutput <> 0     order prev.[datetime] desc ) previousnonzero outer apply (     select top 1 poweroutput      [dbo].[my_table] future     future.[datetime] > main.[datetime]     , poweroutput <> 0     order future.[datetime] ) nextnonzero order [datetime] 

i'm not 100% sure whether this:

((previous value-next value)/previous value)*100 <5 

is logic want use though. looks you're trying identify whether value changes more or less 5% previous non-zero value next one, work if changes occur in 1 direction, otherwise negative values (your sample dataset has values calculation ranging -0.23 0.27).

if want identify instances poweroutput value changing more 5% (in either direction), alter inner case statement in query above from:

case when ((previousnonzero.poweroutput - nextnonzero.poweroutput) / previousnonzero.poweroutput) * 100 < 5 

to:

case when (abs(previousnonzero.poweroutput - nextnonzero.poweroutput) / previousnonzero.poweroutput) * 100 < 5 

Comments

Popular posts from this blog

sql server - Cannot query correctly (MSSQL - PHP - JSON) -

php - trouble displaying mysqli database results in correct order -

C++ Linked List -