MySQL пытается ранжировать строки по порядку - PullRequest
0 голосов
/ 14 января 2019

Я хотел бы рассчитать упорядоченный ранг для моих строк. Он не рассчитывается правильно - я получаю только ноль и 1. Я ожидаю получить ранг 1, 2, 3 ... на основе моих объединений / порядка: ladder_name_lh2 = ladder_name_lh1 и date_trigger_event_lh2 и member_id_lh1.

По сути, я пытаюсь сказать, Если ladder_name_2 совпадает с ladder_name_1 (это настройка до / после - лестница 2 идет после лестницы 1, и есть 6 имен лестниц (категорий), но чтобы сказать, что они связаны, я хочу убедиться, что ранг генерируется только если категории до и после совпадения), а затем генерирует ранг на основе date_2, member_id.

Я написал следующее:

select 
        cte_ladder_history_self_join_lh1.member_id_lh1,
        cte_ladder_history_self_join_lh1.ladder_config_id_lh1,
        cte_ladder_history_self_join_lh1.trigger_name_lh1,
        cte_ladder_history_self_join_lh1.trigger_record_id_lh1,
        cte_ladder_history_self_join_lh1.date_trigger_event_lh1,
        cte_ladder_history_self_join_lh1.ladder_name_lh1,
        cte_ladder_history_self_join_lh1.ladder_value_lh1,
        cte_ladder_history_self_join_lh1.ladder_change_lh1,
        cte_ladder_history_self_join_lh2.member_id_lh2,
        cte_ladder_history_self_join_lh2.trigger_name_lh2,
        cte_ladder_history_self_join_lh2.trigger_record_id_lh2,
        cte_ladder_history_self_join_lh2.date_trigger_event_lh2,
        cte_ladder_history_self_join_lh2.ladder_name_lh2,
        cte_ladder_history_self_join_lh2.ladder_value_lh2,
        cte_ladder_history_self_join_lh2.ladder_change_lh2,
        datediff(cte_ladder_history_self_join_lh2.date_trigger_event_lh2,cte_ladder_history_self_join_lh1.date_trigger_event_lh1) as days_spent,
        @member_id:=member_id_lh2 AS member_id,
        @row_number:=(CASE
                WHEN @member_id = member_id_lh1
                THEN @row_number + 1
                ELSE 1
            END) AS rank 

    from 
        cte_ladder_history_self_join_lh1 #previous or current ladder history 
            left join cte_ladder_history_self_join_lh2 on cte_ladder_history_self_join_lh1.member_id_lh1 = cte_ladder_history_self_join_lh2.member_id_lh2
                and cte_ladder_history_self_join_lh2.ladder_name_lh2 = cte_ladder_history_self_join_lh1.ladder_name_lh1
                and cte_ladder_history_self_join_lh1.ladder_value_lh1 <> cte_ladder_history_self_join_lh2.ladder_value_lh2
                and cte_ladder_history_self_join_lh1.date_trigger_event_lh1 < cte_ladder_history_self_join_lh2.date_trigger_event_lh2 # lh2 shows second begin date / end date for lh if exists
        order by date_trigger_event_lh2 desc, member_id_lh1 desc; 

, который возвращает следующее: enter image description here

Я не уверен, почему рейтинг не работает правильно. Я ожидаю, что будет рейтинг от 1 до 20 (в зависимости от количества строк, которые соответствуют критерию ladder_name = адвокация для этого человека), но я получаю некоторые совершенно разные цифры.

Мысли?

1 Ответ

0 голосов
/ 25 января 2019

Исправлен код ранжирования:

CREATE TEMPORARY TABLE cte_leenk_ladder_history_rank
    SELECT * ,
    @row_number:=(CASE
    WHEN @member_id = member_id
    THEN @row_number + 1
    ELSE 1
    END) AS rank,
    @member_id := member_id

    FROM 
    cte_leenk_ladder_history_order
    where ladder_change = 1
    order by salesforce_id desc, date_trigger_event desc;
...