Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Необычная MAX аггрегация  [new]
PavM
Member

Откуда:
Сообщений: 122
Доброго времени суток
Есть таблица
CREATE TABLE RawData (
ObjectID INT NOT NULL,
PeriodEnd DATE NOT NULL,
AsOf DATE NOT NULL)

Нужно для каждого Target.ObjectID, Target.PeriodEnd найти максимальный AsOf, при условии ObjectID = Target.ObjectID AND PeridoEnd < = Target.PeriodEnd

Сейчас это сделано 2мя проходами и не очень удачно. Что-то типа
SELECT T.*, c.MaxAsOf
FROM (SELECT DISTINCT ObjectID, PeriodEnd FROM RawData) T
    CROSS APPLY (SELECT MaxAsOf = MAX(AsOf) FROM RawData r WHERE r.ObjectID = t.ObjectID AND r.PEriodEnd < = t.PeriodEnd) C


Модет кто-то подскажет более удачное решение через 1 проход таблицы?

SQL 2012
7 окт 14, 12:01    [16670258]     Ответить | Цитировать Сообщить модератору
 Re: Необычная MAX аггрегация  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
а group by, having не помогут?
7 окт 14, 12:29    [16670470]     Ответить | Цитировать Сообщить модератору
 Re: Необычная MAX аггрегация  [new]
wql
Member

Откуда:
Сообщений: 7
select ObjectID,PeriodEnd,MAX(AsOf) AsOf
from RawData
group by ObjectID,PeriodEnd
?
7 окт 14, 12:32    [16670487]     Ответить | Цитировать Сообщить модератору
 Re: Необычная MAX аггрегация  [new]
PavM
Member

Откуда:
Сообщений: 122
wql
select ObjectID,PeriodEnd,MAX(AsOf) AsOf
from RawData
group by ObjectID,PeriodEnd
?


это не то. тут выбирается максимум среди текущего period end, а надо среди всех, которые раньше или равны

Winnipuh
а group by, having не помогут?

я решения через having придумать не смог. Если найдётся решение, буду рад
7 окт 14, 12:35    [16670506]     Ответить | Цитировать Сообщить модератору
 Re: Необычная MAX аггрегация  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1451
если честно странная кострукция, объект "Target" подразумевается отдельной таблицей или той же?

Если той же то почему не
select
        ObjectID,
        PeriodEnd,
        MAX(AsOf)
from RawData
group by ObjectID, PeriodEnd
7 окт 14, 12:38    [16670534]     Ответить | Цитировать Сообщить модератору
 Re: Необычная MAX аггрегация  [new]
Glory
Member

Откуда:
Сообщений: 104760
PavM
Модет кто-то подскажет более удачное решение через 1 проход таблицы?

1 проход таблицы - это
читать каждую запись один раз
или
использовать имя таблицы только один раз
или
еще что-то ?
7 окт 14, 12:40    [16670546]     Ответить | Цитировать Сообщить модератору
 Re: Необычная MAX аггрегация  [new]
PavM
Member

Откуда:
Сообщений: 122
для наглядности
INSERT INTO RawData
SELECT 1, '2014-01-31', '2014-03-31' UNION ALL
SELECT 1, '2014-02-28', '2014-01-31' UNION ALL
SELECT 2, '2014-03-31', '2014-01-31'


получить надо
ObjectID	PeriodEnd	MaxAsOf
1	2014-01-31	2014-03-31
1	2014-02-28	2014-03-31
2	2014-03-31	2014-01-31
7 окт 14, 12:43    [16670571]     Ответить | Цитировать Сообщить модератору
 Re: Необычная MAX аггрегация  [new]
wql
Member

Откуда:
Сообщений: 7
Запросы выше выбирают согласно вашего ТЗ
автор
для каждого Target.ObjectID, Target.PeriodEnd найти максимальный AsOf


автор
при условии ObjectID = Target.ObjectID AND PeridoEnd < = Target.PeriodEnd

вот это не понятно. Объясните что Вам нужно
7 окт 14, 12:43    [16670574]     Ответить | Цитировать Сообщить модератору
 Re: Необычная MAX аггрегация  [new]
PavM
Member

Откуда:
Сообщений: 122
Glory,

читать таблицу 1 раз
7 окт 14, 12:44    [16670580]     Ответить | Цитировать Сообщить модератору
 Re: Необычная MAX аггрегация  [new]
invm
Member

Откуда: Москва
Сообщений: 9405
select ObjectID, PeriodEnd, max(AsOf) over (partition by ObjectID order by PeriodEnd) from RawData;
7 окт 14, 12:47    [16670597]     Ответить | Цитировать Сообщить модератору
 Re: Необычная MAX аггрегация  [new]
wql
Member

Откуда:
Сообщений: 7
select ObjectID, PeriodEnd, max(AsOf) over (partition by ObjectID ) 
from RawData 
7 окт 14, 12:52    [16670633]     Ответить | Цитировать Сообщить модератору
 Re: Необычная MAX аггрегация  [new]
PavM
Member

Откуда:
Сообщений: 122
invm
select ObjectID, PeriodEnd, max(AsOf) over (partition by ObjectID order by PeriodEnd) from RawData;


спасибо. это вроде работает
7 окт 14, 13:03    [16670703]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить