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)。
用户 321
在 unclassified
purchase_bucket
中出现 1 次(Frequency
= 1)。
问题是当用户的 Frequency
有超过 1 个 purchase_bucket
并且他们有相同的频率时
例如:用户125
对unclassified
和4
有相同的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
我不关心 4
或 2
是否出现在购买桶中。
简而言之,当特定用户的购买桶中有一些相同 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
我有一个数据如下图
+---------+-----------------+-----------+
| 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
有超过 1 个 purchase_bucket
并且他们有相同的频率时
例如:用户125
对unclassified
和4
有相同的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
我不关心 4
或 2
是否出现在购买桶中。
简而言之,当特定用户的购买桶中有一些相同 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