Azdak
Lt. Junior Grade
- Registriert
- Okt. 2009
- Beiträge
- 441
Hallo,
ich bin auf der Suche nach einer einfachen Möglichkeit in SQL den Durchschnitt durch den Median zu ersetzen.
Der wesentliche Part, der mir Sorgen bereitet ist recht einfach.
Den Median (ok, es ist nicht wirklich der Median, aber es kommt ihm ausreichend nahe) kann man relativ einfach ermitteln.
Wenn ich das jetzt aber auf eine Gruppierung anwenden möchte wird es unschön. Meine bisher beste Lösung ist:
Diese Lösung ist aus mehreren Gründen suboptimal. Daher die Frage, ob jemand von euch vielleicht einen günstigeren Lösungsansatz hat?
Lauffähig muss es unter MS SQL Server 2008R2 sein. Zusätzlich 2005 währe gut, da ich dort auch noch eine ähnliche Baustelle habe.
Gruß
Azdak
Warum muss man immer erst ein Problem posten bevor man eine bessere Lösung findet?
ich bin auf der Suche nach einer einfachen Möglichkeit in SQL den Durchschnitt durch den Median zu ersetzen.
Der wesentliche Part, der mir Sorgen bereitet ist recht einfach.
Code:
select job_id, avg(dauer) as durchschnitt from job_log group by job_id order by job_id
Code:
select max(wert) from (select top 50 percent wert from tabelle order by wert)
Code:
declare @sqlstr varchar(8000)
set @sqlstr=''
declare @job_id int
declare angebot_cur cursor static read_only for
select distinct job_id from job_log
open angebot_cur
fetch next from angebot_cur into @job_id
while @@fetch_status=0
begin
set @sqlstr=@sqlstr+'
select job_id, max(dauer)
from (
select top 50 percent * from job_log where job_id='+cast(@job_id as varchar(255))+' order by dauer
) a
group by job_id
union all'
fetch next from angebot_cur into @job_id
end
close angebot_cur
deallocate angebot_cur
if len(@sqlstr)>9
set @sqlstr=left(@sqlstr,len(@sqlstr)-9)+'order by job_id'
print @sqlstr
exec(@sqlstr)
Diese Lösung ist aus mehreren Gründen suboptimal. Daher die Frage, ob jemand von euch vielleicht einen günstigeren Lösungsansatz hat?
Lauffähig muss es unter MS SQL Server 2008R2 sein. Zusätzlich 2005 währe gut, da ich dort auch noch eine ähnliche Baustelle habe.
Gruß
Azdak
Ergänzung ()
Warum muss man immer erst ein Problem posten bevor man eine bessere Lösung findet?
Code:
select job_id, dauer from (
select
job_id,
dauer,
count(*) over (partition by job_id ) as anz,
row_number() over (partition by job_id order by dauer ) as num
from job_log ) a
where num=((anz+1)/2)
order by job_id