【问题标题】:SQL Order by groupingSQL 按分组排序
【发布时间】:2015-03-19 05:24:00
【问题描述】:

我有一列 rating,编号为 0 - 1000

我想按rating ASC 对这些行进行排序,但我希望如果评级在 0-99 之间,它们将具有相同的排序顺序(100-199、200-299 等相同)。当从数据库返回时,我希望这些组随机化

这可以通过 SQL 实现吗?

例子:

这是初始表

这是按 asc 进行常规排序后的表格

并以 100 步为一组进行排序,然后随机化

【问题讨论】:

  • 请显示示例输出。在 SQL 中一切皆有可能。
  • 更具体?一个示例输出将不胜感激
  • 因此,两行评级为 199150 可能会以任一顺序出现在输出中,但两者都应该出现在评级为 206 的行之前,并且都应该出现在之后评级为70的一行?
  • 我添加了一个示例流程

标签: sql postgresql group-by sql-order-by


【解决方案1】:

只需将评分除以 100,然后使用random()

SELECT
  *
FROM
  T
ORDER BY Rating/100,random()

假设Rating 是一个整数,除法会自动将结果截断为一个整数,因此可以轻松地将199/100101/100 都视为1

【讨论】:

  • 每组评分会随机出现吗?
  • @NickGinanto - 每行将单独生成一个随机数,并在每个评级组内根据该随机数进行排序。
【解决方案2】:

可能尝试使用偏移量

例子

SELECT rating FROM ratingtable ORDER BY rating ASC LIMIT 100 OFFSET 0;

这将显示 1-100 之间的评分

要显示 101-200 之间的评分,只需将偏移量设置为 100

【讨论】:

    【解决方案3】:

    不太了解您要达到的目标,但我认为您应该尝试使用 OVER PARTITION。试试这个:

    SELECT rating, userid, rank() OVER (PARTITION BY 100 ORDER BY rating ASC) FROM ratingtable ;
    

    【讨论】:

      猜你喜欢
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      • 1970-01-01
      • 2014-05-20
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多