Этот код использует функции SS2008R2, которые не включают в себя LEAD
/LAG
. Лучшее решение, безусловно, возможно в более современных версиях SQL Server.
-- Sample data.
declare @Samples as Table (Product VarChar(10), ProductDate Date,
ProductStatus Bit, DesiredRank Int);
insert into @Samples values
('a', '20160525', 0, 0), ('a', '20160526', 1, 1), ('a', '20160529', 1, 1),
('a', '20160601', 1, 1), ('a', '20160603', 0, 0), ('a', '20160604', 0, 0),
('a', '20160611', 1, 2), ('a', '20160612', 0, 0), ('a', '20160613', 1, 3),
('b', '20160521', 1, 1), ('b', '20160522', 0, 0), ('b', '20160525', 1, 2);
select * from @Samples;
-- Query to rank data as requested.
with WithRN as (
select Product, ProductDate, ProductStatus, DesiredRank,
Row_Number() over (partition by Product order by ProductDate) as RN
from @Samples
),
RCTE as (
select *, Cast(ProductStatus as Int) as C
from WithRN
where RN = 1
union all
select WRN.*, C + Cast(1 - R.ProductStatus as Int) * Cast(WRN.ProductStatus as Int)
from RCTE as R inner join
WithRN as WRN on WRN.Product = R.Product and WRN.RN = R.RN + 1)
select Product, ProductDate, ProductStatus, DesiredRank,
C * ProductStatus as CalculatedRank
from RCTE
order by Product, ProductDate;
Обратите внимание, что данные образца были извлечены из изображения с использованием Eye I Eyeball. Если бы ФП прислушался к советам here, это было бы несколько проще.
Совет. Использование имен столбцов, которые не соответствуют типам данных и ключевым словам, делает жизнь несколько проще.
@ ХАБО, не думай, что ты самый умный здесь. Я всегда стараюсь найти решение перед публикацией здесь, но не мои попытки казались мне разумными. Если вы не хотите помогать просто пройти через – Sher
, я здесь _far_ от самого умного. Мое понимание SO состояло в том, что это не служба написания кода, а место, где можно обратиться за помощью после попытки решить проблему самостоятельно. Таким образом, имеет смысл включить некоторые указания о предпринятых вами усилиях, например. запрос, который не совсем сработал. Это позволяет высококвалифицированным добровольцам помочь вам на соответствующем уровне. Объяснение даун-голосования начинается с «Этот вопрос не показывает никаких исследований ...». Я до сих пор не вижу никаких исследований в этом вопросе. (Ссылка: [Как спросить] (http://stackoverflow.com/help/how-to-ask).) – HABO
@HABO, я не публиковал исследования здесь, чтобы не принести много накладных расходов здесь, так как проблема слишком специфичен, но вот он: я создал два дополнительных столбца: rn - номер строки, разделенный на продукт, где Status is TRUE, rn2 - номер строки, разделенный на продукт. После этого я позволяю строкам входить в два цикла: сначала управляет продуктом, вторым rn2 и «if» манипуляциями, я помещал нужные значения в столбец ранга. Но это работает слишком медленно, так как у меня 2 миллиона строк, поэтому я хотел узнать другое мнение – Sher