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

Откуда:
Сообщений: 50
Доброго вечера,
прошу у вас помощи разобраться с одним запросом.
Нужно получить результаты следующего вида:
ID          Year        Debt                                    DebtOriginYear
----------- ----------- --------------------------------------- --------------
1           2008        0.0                                     2010
1           2009        0.0                                     2010
1           2010        50.0                                    2010
1           2011        75.0                                    2010


где ID - группа данных (дано),
Year - год (дано),
Debt - размер долга (дано),
DebtOriginYear - год, в котором образовался долг (получить) - про него и вопрос.

Можно ли написать соответствующий запрос без использования CTE, только средствами OVER(PARTITION..), каким-то образом указав, что долг должен быть больше нуля при поиске MIN([Year]).

Буду благодарен ценным советам и наставлениям.
25 янв 13, 19:35    [13830249]     Ответить | Цитировать Сообщить модератору
 Re: OVER(PARTITION ..с условием..)  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Aleksandr (kkk),

with cte (ID, Year, Debt) as -- Это не то CTE, без использования которого должен быть запрос :-)
(  select 1, 2008, 0.0    union all
   select 1, 2009, 0.0    union all
   select 1, 2010, 50.0   union all
   select 1, 2011, 75.0
)
select c.ID, c.Year, c.Debt, min(case when c.Debt > 0 then c.Year else null end) over(partition by c.ID) as DebtOriginYear
from cte c
25 янв 13, 19:45    [13830288]     Ответить | Цитировать Сообщить модератору
 Re: OVER(PARTITION ..с условием..)  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
Гость333,

Забавно. Может, я просто навыки подрастерял, но NULL вроде всегда считался наименьшим из всех значений. И запрос
with cte (ID, Year, Debt) as
(  select 1, 2008, 0.0    union all
   select 1, 2009, 0.0    union all
   select 1, 2010, 50.0   union all
   select 1, 2011, 75.0
)
select top (1) with ties c.ID, c.Year, c.Debt,
	case when c.Debt > 0 then c.Year else null end as D
from cte c
order by D;
это вполне подтверждает.

Чего-то я не догоняю...
25 янв 13, 20:44    [13830537]     Ответить | Цитировать Сообщить модератору
 Re: OVER(PARTITION ..с условием..)  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Ennor Tiegael
Забавно. Может, я просто навыки подрастерял, но NULL вроде всегда считался наименьшим из всех значений.
Если быть совсем точным, это верно только для ORDER BY.
Агрегатные же функции, в частности MIN(), NULLы вообще игнорируют.
То есть, NULL считался наименьшим, но не всегда.
25 янв 13, 21:19    [13830662]     Ответить | Цитировать Сообщить модератору
 Re: OVER(PARTITION ..с условием..)  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Кстати, с этим эффектом связан навязчивый warning об игнорировании NULL в агрегатной функции,
от которого непросто избавиться.
25 янв 13, 21:21    [13830676]     Ответить | Цитировать Сообщить модератору
 Re: OVER(PARTITION ..с условием..)  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
iap
Кстати, с этим эффектом связан навязчивый warning об игнорировании NULL в агрегатной функции,
от которого непросто избавиться.
непросто - означает "можно"? Не то чтобы напрягало, но интересно
26 янв 13, 02:39    [13831913]     Ответить | Цитировать Сообщить модератору
 Re: OVER(PARTITION ..с условием..)  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Cygapb-007
iap
Кстати, с этим эффектом связан навязчивый warning об игнорировании NULL в агрегатной функции,
от которого непросто избавиться.
непросто - означает "можно"? Не то чтобы напрягало, но интересно


set ansi_warnings off;
26 янв 13, 12:09    [13832494]     Ответить | Цитировать Сообщить модератору
 Re: OVER(PARTITION ..с условием..)  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Knyazev Alexey
Cygapb-007
пропущено...
непросто - означает "можно"? Не то чтобы напрягало, но интересно


set ansi_warnings off;
Только вот часто сервер требует, чтобы было
set ansi_warnings on;
Поэтому "непросто" в смысде "не всегда"
26 янв 13, 13:44    [13832700]     Ответить | Цитировать Сообщить модератору
 Re: OVER(PARTITION ..с условием..)  [new]
Aleksandr (kkk)
Member

Откуда:
Сообщений: 50
Ох! Ребята, я вам очень благодарен!
В очередной раз убеждаюсь, что сиквел в умелых руках - ах какая штука!
28 янв 13, 10:15    [13837518]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить