ProfileDeferred ProcessingBlog Tools Help

Blog


    August 09

    Psudo Median Aggregate

    /*
    Psuedo Median Aggregrate
     
    In an item I previously blogged, YAMC, I showed how to use the ROW_NUMBER() function in SQL Server 2005 to do a pretty efficient median calculation. Being able to calculate the median in an expression can be useful, but a median aggregate function would be much more useful.
     
    Well T-SQL, even in SQL Server 2005, doesn't provide a median aggregate function and the is no way to write one using user defined aggregates written in a CLR language either.
     
    Remember that an aggregate is set in, scalar out. YAMC was an aggregate calculation, but not an aggregate function. One of the useful things about aggregate function, like SUM(), is that they can be used in conjunction with GROUP BY phrases, so you can get an aggregate per some kind of value.
     
    We are going to look at how to extend the YAMC to use a GROUP BY phrase so that it can be used, efficiently, to produce the same results as a MEDIAN() aggregate function would.
     
    We will use the sales table that follows as example data. A script that will initialize it with some sample data is at the end of this blog item.
    */
     
    Create
    table Sales
    (
    PONumber int Primary Key,
    Value
    Money,
    State NCHAR(2)
    )
    /*
    A simple aggregate calculation could be the SUM of the values by state.
    */
     
    SELECT
    State, SUM(value) FROM Sales GROUP BY State
     
    /*
    Here is a little bit of the output...
     
    NB 891760.7953
    WI 1001671.6347
    PA 962849.0728
    IL 1055766.3988
     
    What we would like to do thougth is:
     
    SELECT State, MEDIAN(Value) FROM Sales GROUP BY State
     
    but that won't work because T-SQL has no  MEDIAN aggregate function.
     
    We could calculate the median of the whole table or a specific state using YAMC by modifying it a bit to just use rows from the state we are interest in.
     
    */
     
    with
    positions
    as
    (
    select
    (1 + Count(*)) / 2 as mid,
    1-(count(*) % 2) as even
    from
    Sales where State = 'NB'
    ),
    rows
    as
    (
    select
    value,
    ROW_NUMBER() over (order by value) as rn
    from
    Sales where State = 'NB'
    )
    select
    'NB' as State, AVG(value) from rows JOIN positions on
    rn in (positions.mid, positions.mid + positions.even)
    /*
     
    And we get...
     
    NB 4218.464
     
    It turns out ROW_NUMBER() has a friend named PARTITION BY, whose purpose in spirit is the same as GROUP BY. In fact by using PARTITION  BY and GROUP BY together we can do an aggregate calculation grouped by a value, just as you can using the built in aggregate functions.
     
    Here is a "psuedo" median aggregate that calculates the median sales value by state.
     
    */
     
    -- psuedo median aggregate
    WITH
    positions
    AS
    (
    SELECT
    (1 + count(*)) / 2 AS mid,
    1-(count(*) % 2) AS even,
    state
    FROM
    Sales GROUP BY state
    ),
    rows AS
    (
    SELECT
    value, state, row_number() OVER
    (PARTITION BY state order by value) AS rn FROM sales
    )
    SELECT
    rows.state, AVG(rows.value) AS median
    FROM
    rows JOIN positions
    ON
    rows.state = positions.state
    AND
    rows.rn IN
    (
    positions.mid, positions.mid + positions.even)
    GROUP
    BY rows.state
    /*
    This explaination assumes you have already read the YAMC blog item.
     
    Similar as in YAMC, positions calculates the mid and even values, but this time groups the values by state.
     
    Again, similar to YAMC, rows associates a row number with each value, but this time partitions the row numbers by state. This means that each state will have its own set of row numbers starting with one.
     
    The SELECT that follows the CTE's is a bit more complex than the one in YAMC. It joins together positions and rows just as YAMC did. However it adds to the predicate a clause that makes the row and positions have the same state. And at the end it groups the AVG() aggregate by state.
     
    Here is a little bit of what it produces...
     
    AK 5158.6132
    AL 5222.3433
    AR 5347.351
    AZ 5190.8084
    CA 5015.9836
    NB 4218.464
     
    It would be much easier, and a lot more flexible, if T-SQL just gave us a MEDIAN() aggregate function, but for now at least we can do a real Median grouped by value if we want to.
     
     
    Since this idiom accomplises pretty much what an aggregate function does, I wonder if the SQL team could cook up a syntax that used PARTITION BY and GROUP BY so that we could write our own user defined aggregates in T-SQL? One can dream...
     
    */
     
    -- genrates test data
    DECLARE
    @index int
    SET
    @index = 10000
    WHILE
    @index > 0
    BEGIN
    DECLARE
    @state NVARCHAR(2)
    DECLARE
    @rand float
    SET
    @rand =RAND() * 50
    SET
    @state = CASE
    WHEN
    @rand < 1 THEN N'AL'
    WHEN
    @rand < 2 THEN N'AK'
    WHEN
    @rand < 3 THEN N'AZ'
    WHEN
    @rand < 4 THEN N'CA'
    WHEN
    @rand < 5 THEN N'CO'
    WHEN
    @rand < 6 THEN N'CT'
    WHEN
    @rand < 7 THEN N'DE'
    WHEN
    @rand < 8 THEN N'FL'
    WHEN
    @rand < 9 THEN N'GA'
    WHEN
    @rand < 10 THEN N'HI'
    WHEN
    @rand < 11 THEN N'ID'
    WHEN
    @rand < 12 THEN N'IL'
    WHEN
    @rand < 13 THEN N'IA'
    WHEN
    @rand < 14 THEN N'IN'
    WHEN
    @rand < 15 THEN N'KS'
    WHEN
    @rand < 16 THEN N'KY'
    WHEN
    @rand < 17 THEN N'LA'
    WHEN
    @rand < 18 THEN N'MA'
    WHEN
    @rand < 19 THEN N'MD'
    WHEN
    @rand < 20 THEN N'MN'
    WHEN
    @rand < 21 THEN N'MI'
    WHEN
    @rand < 22 THEN N'MS'
    WHEN
    @rand < 23 THEN N'MO'
    WHEN
    @rand < 24 THEN N'MT'
    WHEN
    @rand < 25 THEN N'NB'
    WHEN
    @rand < 26 THEN N'NV'
    WHEN
    @rand < 27 THEN N'NH'
    WHEN
    @rand < 28 THEN N'NJ'
    WHEN
    @rand < 29 THEN N'NM'
    WHEN
    @rand < 30 THEN N'NY'
    WHEN
    @rand < 31 THEN N'NC'
    WHEN
    @rand < 32 THEN N'ND'
    WHEN
    @rand < 33 THEN N'OH'
    WHEN
    @rand < 34 THEN N'OK'
    WHEN
    @rand < 35 THEN N'OR'
    WHEN
    @rand < 36 THEN N'PA'
    WHEN
    @rand < 37 THEN N'RI'
    WHEN
    @rand < 38 THEN N'SC'
    WHEN
    @rand < 39 THEN N'SD'
    WHEN
    @rand < 40 THEN N'TN'
    WHEN
    @rand < 41 THEN N'TX'
    WHEN
    @rand < 42 THEN N'UT'
    WHEN
    @rand < 43 THEN N'VT'
    WHEN
    @rand < 44 THEN N'VA'
    WHEN
    @rand < 45 THEN N'WA'
    WHEN
    @rand < 46 THEN N'WV'
    WHEN
    @rand < 47 THEN N'WI'
    WHEN
    @rand < 48 THEN N'WY'
    WHEN
    @rand < 49 THEN N'AR'
    WHEN
    @rand < 50 THEN N'AL'
    END
    DECLARE
    @value MONEY
    SET
    @value = RAND() * 10000
    INSERT
    INTO SALES VALUES (@index, @value, @state)
    SET
    @index = @index - 1
    END

    Comments (8)

    Please wait...
    Sorry, the comment you entered is too long. Please shorten it.
    You didn't enter anything. Please try again.
    Sorry, we can't add your comment right now. Please try again later.
    To add a comment, you need permission from your parent. Ask for permission
    Your parent has turned off comments.
    Sorry, we can't delete your comment right now. Please try again later.
    You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
    Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
    Complete the security check below to finish leaving your comment.
    The characters you type in the security check must match the characters in the picture or audio.

    To add a comment, sign in with your Windows Live ID (if you use Hotmail, Messenger, or Xbox LIVE, you have a Windows Live ID). Sign in


    Don't have a Windows Live ID? Sign up

    No namewrote:
    http://www.batteryfast.com/laptop-ac-adapter/compaq/compaq-19V-3.16A-60w-5.5mm-2.5mm.php
    http://www.batteryfast.com/laptop-ac-adapter/dell/dell-19.5V-4.62A-90w-7.4mm-5.0mm-with-pin-pa-10.php
    http://www.batteryfast.com/laptop-ac-adapter/dell/dell-19.5V-6.7A-130w-7.4mm-5.0mm-with-pin-pa-13.php
    http://www.batteryfast.com/laptop-ac-adapter/dell/dell-19.5V-7.7A-150w-7.4mm-5.0mm-with-pin-pa-15.php
    http://www.batteryfast.com/laptop-ac-adapter/delta/delta-19V-3.42A-65w-5.5mm-2.5mm.php
    http://www.batteryfast.com/laptop-ac-adapter/delta/delta-19V-4.74A-90w-5.5mm-2.5mm.php
    http://www.batteryfast.com/laptop-ac-adapter/fujitsu/fujitsu-19V-3.16A-60w-5.5mm-2.5mm.php
    http://www.batteryfast.com/laptop-ac-adapter/fujitsu/fujitsu-19V-4.22A-80w-5.5mm-2.5mm.php
    http://www.batteryfast.com/laptop-ac-adapter/hp/hp-18.5V-4.9A-90w-5.5mm-2.5mm.php
    http://www.batteryfast.com/laptop-ac-adapter/hp/hp-18.5V-4.9A-90w-flat-dc.php
    http://www.batteryfast.com/laptop-ac-adapter/hp/hp-18.5V-6.5A-120w-5.5mm-2.5mm.php
    http://www.batteryfast.com/laptop-ac-adapter/hp/hp-18.5V-6.5A-120w-flat-dc.php
    http://www.batteryfast.com/laptop-ac-adapter/hp/hp-19V-7.1A-135w-flat-dc.php
    http://www.batteryfast.com/laptop-ac-adapter/hp/hp-19V-3.16A-60w-5.5mm-2.5mm.php
    http://www.batteryfast.com/laptop-ac-adapter/ibm/ibm-16V-3.5A-56w-5.5mm-2.5mm.php
    http://www.batteryfast.com/laptop-ac-adapter/ibm/ibm-20V-3.25A-65w-7.9mm-5.5mm-DC-with-pin-inside.php
    http://www.batteryfast.com/laptop-ac-adapter/ibm/ibm-20V-4.5A-90w-7.9mm-5.5mm-grey-DC-with-pin-inside.php
    http://www.batteryfast.com/laptop-ac-adapter/liteon/liteon-19V-3.16A-60w-5.5mm-2.5mm.php
    http://www.batteryfast.com/laptop-ac-adapter/liteon/liteon-20V-6A-120w-5.5mm-2.5mm.php
    http://www.batteryfast.com/laptop-ac-adapter/liteon/liteon-19V-6.3A-120w-4-pin.php
    http://www.batteryfast.com/laptop-ac-adapter/liteon/liteon-20V-6A-120w-4-pin.php
    http://www.batteryfast.com/laptop-ac-adapter/samsung/samsung-19V-4.74A-90w-5.5mm-3.0mm.php
    http://www.batteryfast.com/laptop-ac-adapter/sony/sony-19.5V-4.7A-90w-6.5mm-4.4mm.php
    http://www.batteryfast.com/laptop-ac-adapter/sony/sony-16V-4A-65w-6.5mm-4.4mm.php
    http://www.batteryfast.com/laptop-ac-adapter/sony/sony-19.5V-3A-58w-6.5mm-4.4mm.php
    http://www.batteryfast.com/laptop-ac-adapter/sony/sony-19.5V-4.1A-80w-6.5mm-4.4mm.php
    http://www.batteryfast.com/laptop-ac-adapter/toshiba/toshiba-15V-3A-45w-6.3mm-3.0mm.php
    http://www.batteryfast.com/laptop-ac-adapter/toshiba/toshiba-15V-4A-60w-6.3mm-3.0mm.php
    http://www.batteryfast.com/laptop-ac-adapter/toshiba/toshiba-19V-3.16A-60w-5.5mm-2.5mm.php
    http://www.batteryfast.com/laptop-ac-adapter/toshiba/toshiba-19V-6.3A-120w-6.3mm-3.0mm.php
    http://www.batteryfast.com/laptop-ac-adapter/universal/universal-12-20V-90W-universal.php
    http://www.batteryfast.com/laptop-ac-adapter/universal/universal-12-20V-120W-universal.php

    Sept. 11
    No namewrote:
    http://www.batteryfast.co.uk/ibm/thinkpad-r50.htm ibm thinkpad r50 battery
    http://www.batteryfast.co.uk/ibm/thinkpad-r50e.htm ibm thinkpad r50e battery
    http://www.batteryfast.co.uk/ibm/thinkpad-r50p.htm ibm thinkpad r50p battery
    http://www.batteryfast.co.uk/ibm/thinkpad-r51.htm ibm thinkpad r51 battery
    http://www.batteryfast.co.uk/ibm/thinkpad-r52.htm ibm thinkpad r52 battery
    http://www.batteryfast.co.uk/ibm/thinkpad-t40.htm ibm thinkpad t40 battery
    http://www.batteryfast.co.uk/ibm/thinkpad-t40p.htm ibm thinkpad t40p battery
    http://www.batteryfast.co.uk/ibm/thinkpad-t41.htm ibm thinkpad t41 battery
    http://www.batteryfast.co.uk/ibm/thinkpad-t41p.htm ibm thinkpad t41p battery
    http://www.batteryfast.co.uk/ibm/thinkpad-t42.htm ibm thinkpad t42 battery
    http://www.batteryfast.co.uk/ibm/thinkpad-t42p.htm ibm thinkpad t42p battery
    http://www.batteryfast.co.uk/ibm/thinkpad-t43.htm ibm thinkpad t43 battery
    http://www.batteryfast.co.uk/ibm/thinkpad-t43p.htm ibm thinkpad t43p battery
    http://www.batteryfast.co.uk/ibm/08k8195.htm ibm 08k8195 battery
    http://www.batteryfast.co.uk/ibm/92p1101.htm ibm 92p1101 battery
    http://www.batteryfast.co.uk/ibm/thinkpad-x20.htm ibm thinkpad x20 battery
    http://www.batteryfast.co.uk/ibm/thinkpad-x21.htm ibm thinkpad x21 battery
    http://www.batteryfast.co.uk/ibm/thinkpad-x22.htm ibm thinkpad x22 battery
    http://www.batteryfast.co.uk/ibm/thinkpad-x23.htm ibm thinkpad x23 battery
    http://www.batteryfast.co.uk/ibm/thinkpad-x24.htm ibm thinkpad x24 battery
    http://www.batteryfast.co.uk/ibm/02k6651.htm ibm 02k6651 battery
    http://www.batteryfast.co.uk/ibm/thinkpad-x30.htm ibm thinkpad x30 battery
    http://www.batteryfast.co.uk/ibm/thinkpad-x30.htm ibm thinkpad x30 battery
    http://www.batteryfast.co.uk/ibm/08k8040.htm ibm 08k8040 battery
    http://www.batteryfast.co.uk/ibm/thinkpad-x60.htm ibm thinkpad x60 battery
    http://www.batteryfast.co.uk/ibm/thinkpad-x60s.htm ibm thinkpad x60s battery
    http://www.batteryfast.co.uk/ibm/thinkpad-z60m.htm ibm thinkpad z60m battery
    http://www.batteryfast.co.uk/ibm/thinkpad-z61m.htm ibm thinkpad z61m battery
    http://www.batteryfast.co.uk/ibm/thinkpad-z61p.htm ibm thinkpad z61p battery
    http://www.batteryfast.co.uk/ibm/thinkpad-z61e.htm ibm thinkpad z61e battery
    http://www.batteryfast.co.uk/ibm/thinkpad-z60t.htm ibm thinkpad z60t battery
    http://www.batteryfast.co.uk/ibm/thinkpad-x61t.htm ibm thinkpad x61t battery
    http://www.batteryfast.co.uk/ibm/thinkpad-x200.htm ibm thinkpad x200 battery
    http://www.batteryfast.co.uk/ibm/02k6699.htm ibm 02k6699 battery
    http://www.batteryfast.co.uk/ibm/02k6616.htm ibm 02k6616 battery
    http://www.batteryfast.co.uk/ibm/02k6513.htm ibm 02k6513 battery
    http://www.batteryfast.co.uk/ibm/02k6580.htm ibm 02k6580 battery
    http://www.batteryfast.co.uk/ibm/02k6620.htm ibm 02k6620 battery
    http://www.batteryfast.co.uk//02k6837-02k6839.htm 02k6837 02k6839 battery
    http://www.batteryfast.co.uk/toshiba/pa3384u-1bas.htm toshiba pa3384u-1bas battery
    http://www.batteryfast.co.uk/toshiba/satellite-a60.htm toshiba satellite a60 battery
    http://www.batteryfast.co.uk/toshiba/satellite-a65.htm toshiba satellite a65 battery
    http://www.batteryfast.co.uk/toshiba/satellite-pro-a60.htm toshiba satellite pro a60 battery
    http://www.batteryfast.co.uk/sony/pcga-bp1n.htm sony pcga-bp1n battery
    http://www.batteryfast.co.uk/sony/pcga-bp71.htm sony pcga-bp71 battery
    http://www.batteryfast.co.uk/sony/pcga-bp71a.htm sony pcga-bp71a battery

    Sept. 11
    No namewrote:
    http://www.batteryfast.com/compaq/nc6000.htm compaq nc6000 battery
    http://www.batteryfast.com/compaq/nx5000.htm compaq nx5000 battery
    http://www.batteryfast.com/compaq/n600.htm compaq n600 battery
    http://www.batteryfast.com/compaq/n600c.htm compaq n600c battery
    http://www.batteryfast.com/compaq/n610c.htm compaq n610c battery
    http://www.batteryfast.com/compaq/n610v.htm compaq n610v battery
    http://www.batteryfast.com/compaq/n620c.htm compaq n620c battery
    http://www.batteryfast.com/compaq/presario-2100.htm compaq presario 2100 battery
    http://www.batteryfast.com/compaq/ze4000.htm compaq ze4000 battery
    http://www.batteryfast.com/compaq/f4809a.htm compaq f4809a battery
    http://www.batteryfast.com/compaq/f4812a.htm compaq f4812a battery
    http://www.batteryfast.com/compaq/310924-b25.htm compaq 310924-b25 battery
    http://www.batteryfast.com/compaq/pp2162s.htm compaq pp2162s battery
    http://www.batteryfast.com/compaq/pp2160.htm compaq pp2160 battery
    http://www.batteryfast.com/dell/d400.htm dell d400 battery
    http://www.batteryfast.com/dell/latitude-d400.htm dell latitude d400 battery
    http://www.batteryfast.com/dell/latitude-x200.htm dell latitude x200 battery
    http://www.batteryfast.com/dell/8u443.htm dell 8u443 battery
    http://www.batteryfast.com/dell/312-0058.htm dell 312-0058 battery
    http://www.batteryfast.com/dell/1691p.htm dell 1691p battery
    http://www.batteryfast.com/dell/inspiron-8000.htm dell inspiron 8000 battery
    http://www.batteryfast.com/dell/inspiron-2500.htm dell inspiron 2500 battery
    http://www.batteryfast.com/dell/inspiron-3700.htm dell inspiron 3700 battery
    http://www.batteryfast.com/dell/inspiron-3800.htm dell inspiron 3800 battery
    http://www.batteryfast.com/dell/inspiron-4000.htm dell inspiron 4000 battery
    http://www.batteryfast.com/dell/inspiron-1000.htm dell inspiron 1000 battery
    http://www.batteryfast.com/dell/inspiron-1200.htm dell inspiron 1200 battery
    http://www.batteryfast.com/dell/inspiron-2200.htm dell inspiron 2200 battery
    http://www.batteryfast.com/dell/312-0273.htm dell 312-0273 battery
    http://www.batteryfast.com/dell/312-0417.htm dell 312-0417 battery
    http://www.batteryfast.com/dell/451-10180.htm dell 451-10180 battery
    http://www.batteryfast.com/dell/c2174.htm dell c2174 battery
    http://www.batteryfast.com/dell/f1244.htm dell f1244 battery
    http://www.batteryfast.com/dell/g1947.htm dell g1947 battery
    http://www.batteryfast.com/dell/h5559.htm dell h5559 battery
    http://www.batteryfast.com/dell/hj424.htm dell hj424 battery
    http://www.batteryfast.com/dell/inspiron-9100.htm dell inspiron 9100 battery
    http://www.batteryfast.com/dell/inspiron-xps.htm dell inspiron xps battery
    http://www.batteryfast.com/dell/inspiron-2000.htm dell inspiron 2000 battery
    http://www.batteryfast.com/dell/inspiron-2100.htm dell inspiron 2100 battery
    http://www.batteryfast.com/dell/inspiron-2800.htm dell inspiron 2800 battery
    http://www.batteryfast.com/dell/latitude-ls-400.htm dell latitude ls 400 battery
    http://www.batteryfast.com/dell/latitude-c400.htm dell latitude c400 battery
    http://www.batteryfast.com/dell/4e369.htm dell 4e369 battery
    http://www.batteryfast.com/gateway/s62066l.htm gateway s62066l battery
    http://www.batteryfast.com/gateway/squ-412.htm gateway squ-412 battery
    http://www.batteryfast.com/gateway/squ-413.htm gateway squ-413 battery
    http://www.batteryfast.com/gateway/squ-414.htm gateway squ-414 battery
    July 21
    No namewrote:

    Hi,Do you have used LCDs, used flat screens and secondhand LCDs? Please go here:www.sstar-hk.com(Southern Stars).We are constantly buying re-usable LCD panels and working for LCD recycling.The re-usable panels go through strictly designed process of categorizing, checking, testing, repairing and refurbishing before they are re-used to make remanufactured LCD displays and TV sets.Due to our recent breakthrough in testing and repairing technology of LCD, we can improve the value for your LCD panels.

    Contact Us

    E-mail:sstar@netvigator.com
    website:www.sstar-hk.com

    Sept. 11
    No namewrote:
    wow gold!All wow gold US Server 24.99$/1000G on sell! Cheap wow gold,wow gold,wow gold,Buy Cheapest/Safe/Fast WoW US EU wow gold Power leveling wow gold from the time you World of Warcraft gold ordered! wow power leveling wow power leveling power leveling wow power leveling wow powerleveling wow power levelingcheap wow power leveling wow power leveling buy wow power leveling wow power leveling buy power leveling wow power leveling cheap power leveling wow power leveling wow power leveling wow power leveling wow powerleveling wow power leveling power leveling wow power leveling wow powerleveling wow power leveling buy rolex cheap rolex wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling -199017368061229
    June 20
    Picture of Anonymous
    dan99081 wrote:
    Yes, within the 8K limit of a UDA you could make a median aggregate. But it would be very data dependent, so it would be nothing you could rely on in any general way.
    Sept. 1
    Picture of Anonymous
    Adam Machanic wrote:
    What makes you think that there's "no way to write [a median aggregate] using user defined aggregates written in a CLR language"?

    I'm hoping that you're referring to the 8000-byte limit; but that doesn't mean that there's no way to write the aggregate. It means that the aggregate wouldn't operate on larger data sets. These are very different issues, don't you think?
    Aug. 15
    Picture of Anonymous
    Canadamouse wrote:
    Very useful message. Good to know.
    Aug. 15

    Trackbacks

    The trackback URL for this entry is:
    http://dsullivan.spaces.live.com/blog/cns!F253C6CDC8EC1EAC!117.trak
    Weblogs that reference this entry
    • None