Функция RANK () с over создает динамические ранги для каждого запуска - PullRequest
0 голосов
/ 04 июня 2019

Я создаю ранги для разделов моего стола. Разделы выполняются по имени столбца с упорядочением по значению транзакции. Пока я генерирую эти разделы и проверяю счетчик для каждого из рангов, я получаю разные номера в каждом ранге для каждого выполняемого запроса.

select count(*)  FROM (
                        --
                        -- Sort and ranks the element of RFM
                        --
                        SELECT
                            *,
                            RANK() OVER (PARTITION BY name ORDER BY date_since_last_trans desc) AS rfmrank_r,
                        FROM (
                            SELECT
                                name,
                                id_customer,
                                cust_age,
                                gender,
                                DATE_DIFF(entity_max_date, customer_max_date, DAY ) AS date_since_last_trans,
                                txncnt,
                                txnval,
                                txnval / txncnt AS avg_txnval
                            FROM 
                            (
                                SELECT
                                    name,
                                    id_customer,
                                    MAX(cust_age) AS cust_age,
                                 COALESCE(APPROX_TOP_COUNT(cust_gender,1)[OFFSET(0)].VALUE, MAX(cust_gender)) AS gender,
                                    MAX(date_date) AS customer_max_date,
                                    (SELECT MAX(date_date) FROM xxxxx) AS entity_max_date,
                                    COUNT(purchase_amount) AS txncnt,
                                    SUM(purchase_amount) AS txnval
                                FROM
                                    xxxxx
                                WHERE
                                date_date > (
                                    SELECT
                                        DATE_SUB(MAX(date_date), INTERVAL 24 MONTH) AS max_date
                                    FROM
                                        xxxxx)
                                AND cust_age >= 15
                                AND cust_gender IN ('M','F')
                                GROUP BY
                                    name,
                                    id_customer
                            )
                        )
                    )
          group by rfmrank_r

За 1-й пробег я получаю

Row f0
1 3970
2 3017
3 2116
4 2118

За 2-й забег я получаю

Row f0
1 4060
2 3233
3 2260
4 2145

Что можно сделать, если мне нужно получить одинаковое количество разделов, получающих одинаковое ранжирование для каждого прогона Редактировать: Извините за размывание полей Это вывод поля `` `запрос для получения этого столбца````

1 Ответ

0 голосов
/ 05 июня 2019

Функция окна RANK определяет ранг значения в группе значений.Каждое значение ранжируется в пределах своего раздела.Строки с одинаковыми значениями для критериев ранжирования получают одинаковый ранг.Drill добавляет количество связанных строк к связанному рангу, чтобы вычислить следующий ранг, и, таким образом, ранги могут не быть последовательными числами.

Например, если две строки ранжируются 1, следующий ранг равен 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...