OVER(PARTITION ..с условием..)

Aleksandr (kkk)
Дата: 25.01.2013 19:35:42
Доброго вечера,
прошу у вас помощи разобраться с одним запросом.
Нужно получить результаты следующего вида:
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]).

Буду благодарен ценным советам и наставлениям.
Гость333
Дата: 25.01.2013 19:45:34
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
Ennor Tiegael
Дата: 25.01.2013 20:44:11
Гость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;
это вполне подтверждает.

Чего-то я не догоняю...
iap
Дата: 25.01.2013 21:19:17
Ennor Tiegael
Забавно. Может, я просто навыки подрастерял, но NULL вроде всегда считался наименьшим из всех значений.
Если быть совсем точным, это верно только для ORDER BY.
Агрегатные же функции, в частности MIN(), NULLы вообще игнорируют.
То есть, NULL считался наименьшим, но не всегда.
iap
Дата: 25.01.2013 21:21:55
Кстати, с этим эффектом связан навязчивый warning об игнорировании NULL в агрегатной функции,
от которого непросто избавиться.
Cygapb-007
Дата: 26.01.2013 02:39:21
iap
Кстати, с этим эффектом связан навязчивый warning об игнорировании NULL в агрегатной функции,
от которого непросто избавиться.
непросто - означает "можно"? Не то чтобы напрягало, но интересно
Knyazev Alexey
Дата: 26.01.2013 12:09:30
Cygapb-007
iap
Кстати, с этим эффектом связан навязчивый warning об игнорировании NULL в агрегатной функции,
от которого непросто избавиться.
непросто - означает "можно"? Не то чтобы напрягало, но интересно


set ansi_warnings off;
iap
Дата: 26.01.2013 13:44:58
Knyazev Alexey
Cygapb-007
пропущено...
непросто - означает "можно"? Не то чтобы напрягало, но интересно


set ansi_warnings off;
Только вот часто сервер требует, чтобы было
set ansi_warnings on;
Поэтому "непросто" в смысде "не всегда"
Aleksandr (kkk)
Дата: 28.01.2013 10:15:14
Ох! Ребята, я вам очень благодарен!
В очередной раз убеждаюсь, что сиквел в умелых руках - ах какая штука!