SQL einfache Methode zum Ersetzen des Durchschnitt durch den Median gesucht

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.
Code:
select job_id, avg(dauer) as durchschnitt from job_log group by job_id order by job_id
Den Median (ok, es ist nicht wirklich der Median, aber es kommt ihm ausreichend nahe) kann man relativ einfach ermitteln.
Code:
select max(wert) from (select top 50 percent wert from tabelle order by wert)
Wenn ich das jetzt aber auf eine Gruppierung anwenden möchte wird es unschön. Meine bisher beste Lösung ist:
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
 
...weil einem bei der Formulierung des Problems erst klar wird, wo genau der Fehler liegt/liegen könnte! ;)
 
Zurück
Oben