Glorf.it

Glorf IT

Bedenkliches aus dem IT-Alltag

8. Juli 2006 um 15:05

Alfelder Windloch

In meinem aktuellen Projekt in der Firma suchen wir gerade nach einer netten Möglichkeit im Team etwas zu unternehmen. Da fiel mir gleich meine derzeitige Lieblingshöhle ein: das Alfelder Windloch. Ich bin schon mal gespannt, ob die anderen sich darauf einlassen. Das würde mich als Höhen-Freund sehr freuen. Leider schaffe ich normalerweise nur so ein bis zwei Touren im Jahr… 🙁

Diese Höhle bietet für Einsteiger leichte Stellen und für Fortgeschrittene sehr anspruchsvolle Stellen. Jedesmal wenn ich dort bin, dann entdecke ich wieder Ecken in denen ich vorher noch nicht war. Beim letzten Mal zeigte mit der Führer einer anderen Gruppe sogar noch einen ganz einfachen Weg aus dem Labyrinth. Das heißt es gibt mindestens 5, aber vermutlich noch mehr. 😉

Links seht Ihr ein Bild von meinen Begleiterinnen bei der letzten Tour: Mädels aus unserer ELIA-Gemeinde. Wir waren ein super Team und sind bis ganz unten hin gekommen (bis nach Stonehenge).

Hier ein paar Links mit Informationen zum Alfelder Windloch:

Die Rettungsaktion war schon ziemlich Spektakulär und erinnert daran, dass es in den Höhlen auch wirklich gefährlich ist. Man kann ganz leicht mal abrutschen und fällt dann richtig tief. Aber wenn man aufpasst und sich an manchen Stellen abseilt, dann ist das Risiko echt überschaubar.

8. Juli 2006 um 01:06

WordPress-Plugin "Code Snippet"

Ich habe gerade das WordPress-Plugin "Code Snippet" entdeckt. Damit kann man in WordPress auch formatieren Quell-Code anzeigen:

[code lang="sql"] select max(Quantity) as "schon fast der Median"
from ( SELECT TOP 50 percent Quantity
FROM #bla
order by Quantity) as d [/code]

Die Syntaxhervorbehung ist wirklich irgendwie nett. Das klappt sogar mit WordPress 2.0.
Mit dem Wysiwyg-Editior gehen aber dauernd die Einrückungen verloren. Ich las jetzt das sei ein Bug im Wysiwyg-Editor. Dann muss ich zukünftig wohl den anderen benutzen…

Echte Männer brauchen sowieso kein Wysiwyg! 😉

8. Juli 2006 um 00:31

Ein Median mit SQL Server 2000

Ich habe heute entdeckt, dass bei head.WriteLine(): Das Median-Problem, Teil 2 diskutiert wird, wie man mit SQL den Median berechnen kann. Die folgende Formulierung reizte meinen Spieltrieb:

Dank der neuen Rankingfunktionen des SQL Server 2005, ist die Ermittlung jedoch wesentlich einfacher als mit den Vorgängerversionen. Hier hätte ich den Median nämlich in zeitaufwendigen Cursor- oder Schleifendurchläufen ermitteln müssen.

Generell stimmt es, die neuen Ranking-Funktionen sind wirklich großartig. Ich hatte sie schon sooo lange vermisst. Aber die Geschichte mit den Cursors oder Schleifen möchte ich gerne widerlegen.
Eine simple Median-Berechnung würde mit SQL Server 2000 so aussehen:

select top 1 Quantity as "Fast Median (1)"
     from (    SELECT TOP 50 percent Quantity
                      FROM #bla
                      order by Quantity) as d
     order by Quantity desc

Ein Blick auf den Query Plan zeigt, dass hier noch leichter Spielraum für Verbesserungen besteht:

select max(Quantity) as "Fast Median (2)"
     from (    SELECT TOP 50 percent Quantity
                      FROM #bla
                      order by Quantity) as d

Nun leider ist das Leben nicht immer so einfach. Obige Berechnungen klappen nur bei einer ungeraden Anzahl an Werten. Aber wie man in der Wikipedia nachlesen kann, muss man bei einer geraden Anzahl den Durchschnitt der mittleren Werte ausgeben. Das sieht dann schon komplizierter aus.

select ((select max(Quantity)
                   from (    SELECT TOP 50 percent Quantity
                                    FROM #bla
                                    order by Quantity asc) as d)
          +(select min(Quantity)
                   from (    SELECT TOP 50 percent Quantity
                                    FROM #bla
                                    order by Quantity desc) as d)
          )/2 as "richtiger Median"

Wenn jetzt zu allen Übel die Werte noch ganzzahlig sind, dann muss man vor der Division den Typ in Numeric konvertieren:

select cast(
          (select max(Quantity)
                from (    SELECT TOP 50 percent Quantity
                                   FROM #bla
                            order by Quantity asc) as d)
        +(select min(Quantity)
                from (    SELECT TOP 50 percent Quantity
                                   FROM #bla
                            order by Quantity desc) as d)
        as numeric(12,2))/2 as "richtiger Median bei ganzen Zahlen"

Natürlich ist diese Lösung nicht blitzschnell, aber durch einen geeigneten Index kann man das Ganze doch schön beschleunigen.

Zuletzt noch der Code, um die Beispieltabelle anzulegen und zu bestücken:

if object_id(N'tempdb..#bla') is not null drop table #bla
create table #bla (quantity numeric(12,2))

insert into #bla(quantity) values (1)
insert into #bla(quantity) values (2)
insert into #bla(quantity) values (3)
insert into #bla(quantity) values (4)
insert into #bla(quantity) values (5)
insert into #bla(quantity) values (105)
|