2016-09-28 3 views
-1

У меня есть таблица, которая имеет 3 колонки: продукт, Дату, Статусместа устанавливается в соответствии с условием

Я хочу, чтобы ранжировать таким образом: для каждого заказа продукта по дате и место, если статус = FALSE, то 0, если он ИСТИНА, тогда начинайте с ранжирования на 1, продолжайте ранжирование по тому же значению, если предыдущее состояние имеет значение ИСТИНА.

В этом упорядоченном наборе, если FALSE присваивается ему 0, а для следующего исходящего ИСТИННОГО состояния для одного и того же продукта назначают x + 1 (x здесь - предыдущее значение ранга для состояния TRUE).

Я надеюсь, что картина делает его более ясным

enter image description here

+0

@ ХАБО, не думай, что ты самый умный здесь. Я всегда стараюсь найти решение перед публикацией здесь, но не мои попытки казались мне разумными. Если вы не хотите помогать просто пройти через – Sher

+0

, я здесь _far_ от самого умного. Мое понимание SO состояло в том, что это не служба написания кода, а место, где можно обратиться за помощью после попытки решить проблему самостоятельно. Таким образом, имеет смысл включить некоторые указания о предпринятых вами усилиях, например. запрос, который не совсем сработал. Это позволяет высококвалифицированным добровольцам помочь вам на соответствующем уровне. Объяснение даун-голосования начинается с «Этот вопрос не показывает никаких исследований ...». Я до сих пор не вижу никаких исследований в этом вопросе. (Ссылка: [Как спросить] (http://stackoverflow.com/help/how-to-ask).) – HABO

+0

@HABO, я не публиковал исследования здесь, чтобы не принести много накладных расходов здесь, так как проблема слишком специфичен, но вот он: я создал два дополнительных столбца: rn - номер строки, разделенный на продукт, где Status is TRUE, rn2 - номер строки, разделенный на продукт. После этого я позволяю строкам входить в два цикла: сначала управляет продуктом, вторым rn2 и «if» манипуляциями, я помещал нужные значения в столбец ранга. Но это работает слишком медленно, так как у меня 2 миллиона строк, поэтому я хотел узнать другое мнение – Sher

ответ

1

Этот код использует функции 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, это было бы несколько проще.

Совет. Использование имен столбцов, которые не соответствуют типам данных и ключевым словам, делает жизнь несколько проще.

+0

спасибо, что работает. Он терпит неудачу из-за ошибки «максимальной рекурсии 100», но это моя ошибка, я не указал объем в сообщении. Я предпочел бы продолжить цикл. – Sher

-1

Попробуйте этот запрос,

SELECT a.Product , 
    a.Date , 
    a.Status , 
    CASE WHEN a.Status = 'FALSE' THEN 0 
     ELSE 1 
    END [Rank] 

FROM (SELECT Продукт, Дата, Статус, ROW_NUMBER() OVER (PARTITION BY Продукт ЗАКАЗ ПО ДАТУ, Статус) RNK FROM TableProduct ) a ЗАКАЗ B Y Продукт, a.RNK

+0

спасибо за предложение, но запрос очень отличается от того, что мне нужно – Sher

Смежные вопросы