SQL 将新行排名更高但每 4 行最多一次,否则使用默认顺序
SQL Rank New Rows Higher But Only Max Every 4 Rows, Use Default Order By Otherwise
这个问题看似简单,但是在搞乱了RANK、Partition等之后,我一直没能找到可行的解决方案。
我们有一个简单的 table 拍卖项目,每个项目都有一个搜索分数。我们希望提高新上市的拍卖品的知名度,并每隔 4 个结果显示一次,即使它们的搜索分数较低。新列出的项目本身按搜索分数排名(请注意,如果新列出的项目具有高搜索分数,它可能会略微降级)。
拍卖物品的示例数据:
id
姓名
is_new
搜索得分
300
苹果iPad
假
200
3
三星 s8
假
190
12
另一项
假
181
412
ps4
真
10
33
又一个
假
177
201
观看
假
173
112
iphone x
假
169
450
电子游戏
真
6
12
拍卖品
假
165
我们要解决的问题是提升新项目的数量,而不是让它们聚集在一起。所以在上面的结果中,每个 is_new = true 项目每 4 行显示一次,按搜索分数排序。
我想你可以使用算术技巧。我认为这样做:
order by (case when is_new = 'false'
then row_number() over (partition by is_new order by score desc) * 1.0
else row_number() over (partition by is_new order by is_new score desc) * 3 + 0.5
end)
这会每隔四行插入 is_new = 'true'
条记录。
这个问题看似简单,但是在搞乱了RANK、Partition等之后,我一直没能找到可行的解决方案。
我们有一个简单的 table 拍卖项目,每个项目都有一个搜索分数。我们希望提高新上市的拍卖品的知名度,并每隔 4 个结果显示一次,即使它们的搜索分数较低。新列出的项目本身按搜索分数排名(请注意,如果新列出的项目具有高搜索分数,它可能会略微降级)。
拍卖物品的示例数据:
id | 姓名 | is_new | 搜索得分 |
---|---|---|---|
300 | 苹果iPad | 假 | 200 |
3 | 三星 s8 | 假 | 190 |
12 | 另一项 | 假 | 181 |
412 | ps4 | 真 | 10 |
33 | 又一个 | 假 | 177 |
201 | 观看 | 假 | 173 |
112 | iphone x | 假 | 169 |
450 | 电子游戏 | 真 | 6 |
12 | 拍卖品 | 假 | 165 |
我们要解决的问题是提升新项目的数量,而不是让它们聚集在一起。所以在上面的结果中,每个 is_new = true 项目每 4 行显示一次,按搜索分数排序。
我想你可以使用算术技巧。我认为这样做:
order by (case when is_new = 'false'
then row_number() over (partition by is_new order by score desc) * 1.0
else row_number() over (partition by is_new order by is_new score desc) * 3 + 0.5
end)
这会每隔四行插入 is_new = 'true'
条记录。