Как получить правильную средневзвешенную дату в SQL - PullRequest
1 голос
/ 03 февраля 2010

Я использую этот запрос, чтобы получить среднюю дату:

CONVERT(DATETIME, AVG(CONVERT(FLOAT, ChargeOffDate))) as [Average C/O Date]

Что правильно дает мне дату '2003-08-12 14: 17: 22.103'.

Когда я использую этот запрос, чтобы получить средневзвешенную дату

CONVERT(DATETIME, SUM(CONVERT(FLOAT, ChargeOffDate) * FaceValue) / SUM(FaceValue))

Я получаю дату типа «1938-10-19 21: 28: 48.000», которая далека от средней даты. Я чувствую, что это простая вещь, и мне не хватает чего-то критического, но маленького.

Пример:

declare @temp table (value datetime, [weight] money)
insert into @temp values (NULL,8850.00)
insert into @temp values (NULL,137.91)
insert into @temp values ('2006-01-15',221.13)
insert into @temp values ('2006-10-15',127.40)
insert into @temp values ('2001-07-31',551.44)
insert into @temp values ('1997-10-12',4963.41)
insert into @temp values ('2006-03-15',130.36)
insert into @temp values ('2005-01-07',1306.31)

SELECT
    CONVERT(DATETIME, AVG(CONVERT(FLOAT, value))) as [Avg Date],
    CONVERT(DATETIME, SUM(CONVERT(FLOAT, value) * [weight]) / SUM([weight])) as [Weighted Avg Date]
FROM @temp

Это дает «2003-11-25 20: 00: 00.000» в качестве средней даты и «1944-10-13 10: 52: 10.573» в качестве средневзвешенной. Без нуля это дает '1999-12-02 17: 10: 51.087'. Возможно, моя проблема в том, что нулевые значения сбрасывают мои вычисления.

1 Ответ

2 голосов
/ 03 февраля 2010

Скорее всего, некоторые из ваших ChargeOffDate NULL, но их FaceValues нет.

Эти записи не вносят вклад в первую сумму, но вносят вклад во вторую.

WITH    q (ChargeOffDate, FaceValue) AS
        (
        SELECT  CAST('20030101' AS DATETIME), 1.0
        UNION ALL
        SELECT  CAST('20030201' AS DATETIME), 2.0
        UNION ALL
        SELECT  CAST('20030301' AS DATETIME), 3.0
        UNION ALL
        SELECT  NULL, 4.0
        )
SELECT  CONVERT(DATETIME, SUM(CONVERT(FLOAT, ChargeOffDate) * FaceValue) / SUM(FaceValue))
FROM    q

----
1961-11-12 21:36:00.000

Используйте это:

WITH    q (ChargeOffDate, FaceValue) AS
        (
        SELECT  CAST('20030101' AS DATETIME), 1.0
        UNION ALL
        SELECT  CAST('20030201' AS DATETIME), 2.0
        UNION ALL
        SELECT  CAST('20030301' AS DATETIME), 3.0
        UNION ALL
        SELECT  NULL, 4.0
        )
SELECT  CONVERT(DATETIME, SUM(CONVERT(FLOAT, ChargeOffDate) * FaceValue) / SUM(FaceValue))
FROM    q
WHERE   ChargeOffDate IS NOT NULL

----
2003-02-09 20:00:00.000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...