ЗАКАЗАТЬ ПО СЛУЧАЮ КОГДА в номере строки - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть данные, как показано ниже

+---------+-----------------+-----------+
| user_id | purchase_bucket | Frequency |
+---------+-----------------+-----------+
|     123 | 8               |         2 |
|     321 | unclassified    |         1 |
|     124 | 4               |         3 |
|     124 | unclassified    |         1 |
|     125 | unclassified    |         3 |
|     125 | 4               |         3 |
|     125 | 2               |         1 |
|     126 | 4               |         8 |
|     126 | 2               |         8 |
+---------+-----------------+-----------+

Он дает информацию о том, какой сегмент покупок классифицирован пользователем, и то, сколько раз.

Таким образом, пользователь 123 классифицируетсяв purchase_bucket 8 дважды. (Frequency = 2).

Пользователь 321 находится в unclassified purchase_bucket 1 раз (Frequency = 1).

Проблема в том, что Frequency для пользователя имеет более 1purchase_bucket и они оба имеют одинаковую частоту

Например: пользователь 125 имеет одинаковые Frequency для unclassified и 4, оба имеют 3 в качестве частоты.

Мой желаемый результат следующий:

+---------+-----------------+-----------+
| user_id | purchase bucket | Frequency |
+---------+-----------------+-----------+
|     123 | 8               |         2 |
|     321 | unclassified    |         1 |
|     124 | 4               |         3 |
|     125 | 4               |         3 |
|     126 | 4               |         8 |
+---------+-----------------+-----------+

Так что для пользователей 123, 321 и 124 проблем нет. Но для пользователя 125 я бы хотел 4 вместо unclassified в purchase_bucket.

Для пользователя 126 Мне все равно, придет ли 4 или 2 в корзину покупок.

Короче говоря, я не хочу unclassified, когда есть какое-то число с тем же Frequency в корзине покупок для конкретного пользователя.

Я пытался row_number(), чтобы устранить дубликаты, но не смогполучить желаемые результаты.

Мой запрос и результат

SELECT *
FROM (

SELECT *,
row_number() OVER(PARTITION BY user_id ORDER BY Frequency DESC) as Rn
FROM table1 ) T
WHERE T.Rn = 1

+---------+-----------------+-----------+----+
| user_id | purchase bucket | Frequency | Rn |
+---------+-----------------+-----------+----+
|     123 | 8               |         2 |  1 |
|     124 | 4               |         3 |  1 |
|     125 | unclassified    |         3 |  1 |
|     126 | 4               |         8 |  1 |
|     321 | unclassified    |         1 |  1 |
+---------+-----------------+-----------+----+

Образец Скрипка

Может кто-нибудь помочь мне с этим?

1 Ответ

3 голосов
/ 05 ноября 2019

Вы можете добавить неклассифицированный в ваш заказ.

SELECT *
FROM (
  SELECT *,
     row_number() OVER(PARTITION BY user_id 
                       ORDER BY CASE WHEN [purchase bucket] <> 'unclassified' THEN 0 ELSE 1 END ASC, 
                                Frequency DESC) as Rn
  FROM table1 
) T
WHERE T.Rn = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...