ORDER BY with CASE WHEN 在行号

ORDER BY with CASE WHEN in row number

我有一个数据如下图

+---------+-----------------+-----------+
| 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)。

用户 321unclassified purchase_bucket 中出现 1 次(Frequency = 1)。

问题是当用户的 Frequency 有超过 1 个 purchase_bucket 并且他们有相同的频率时

例如:用户125unclassified4有相同的Frequency,他们都有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 而不是 purchase_bucket.

中的 unclassified

对于用户 126 我不关心 42 是否出现在购买桶中。

简而言之,当特定用户的购买桶中有一些相同 Frequency 的数字时,我不希望 unclassified

我尝试 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 |
+---------+-----------------+-----------+----+

样本fiddle

有人可以帮我吗?

您可以将未分类添加到您的订单中。

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