【问题标题】:how to make NaN value as the lowest when ordering Active Record objects?订购 Active Record 对象时如何将 NaN 值设为最低?
【发布时间】:2021-08-06 12:59:27
【问题描述】:

我想对我的表进行排序,但其中包含 NaN 值,

问题在于 ruby​​/rails NaN 被认为是最高的,而我想将其设为最低?

我正在考虑从列表中删除 NaN 排序非 NaN 列表并在其后添加 NaN

谁有更方便的方法?

我的数据库是 postgresql,列类型是 Decimal/BigDecimal,值是 Decimal/BigDecimal

架构是

create_table "download_speeds", force: :cascade do |t|
    t.bigint "location_id", null: false
    t.string "operator_name"
    t.decimal "avg"
    t.decimal "min"
    t.decimal "max"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["location_id"], name: "index_download_speeds_on_location_id"
  end

我想根据avg 列降序对downloads_speeds 进行排序/排名

最高的avg 最高(排名1)

【问题讨论】:

  • 您使用的是什么数据库?您要排序的列的类型是什么?里面有什么样的价值观?
  • @Josien 更新
  • 这就是PG的NaN排序的工作原理;如果您想要不同的东西,您可能需要 (a) 对返回的数据进行后处理,(b) 仅对有价值的行进行排序并分别检索 NaNs 并进行连接,或者 (c) 改用有意义的值首先是NaN。也就是说,我根本不是 PG 专家 :)
  • 是的,这是我目前的方法@DaveNewton
  • @DaveNewton 感谢洞察这个问题也提供了解决方案stackoverflow.com/questions/48725372/…

标签: ruby-on-rails postgresql rails-activerecord pg


【解决方案1】:

看起来avg 的值应该总是一个正数。因此,在 sql 查询中用 0 代替 NaN 应该会给您所需的排序。您不必在 sql 中编写整个查询,只需 order 子句:

  DownloadSpeed.where(created_at: Date.today).order("CASE WHEN avg='NaN' THEN 0 ELSE 1 END, avg")

【讨论】:

  • 是的,但我更喜欢保留 NaN 而不是用 0 替换它
  • 您只是在 order 子句中替换它,而不是在 db 或结果中替换它
  • 我稍后会尝试,如果我希望这个 NaN 低于 0(当有 0 avg 时)将其更改为 -0.1 或 -1 怎么办?
  • 你也可以调查一下为什么'NaN's 会进入这个专栏。它们可能是合法的,但我认为 avg 值应该 >=0 或 NULL。如果没有正当理由,我的方法是将数据库更新为 NULL 的 iso 'NaN',并修复产生 'NaN' 的计算。然后,您可以在 Postgresql 排序 sn-p 中使用 nulls firstnulls last 控制 NULL 的排序行为。
  • 消除 .reverse 这是一个 hack。 ascdesc 应该可以满足您的需求。要将“NaN”放在具有实际值的记录之前或之后,请将 case 语句中的 0 和 1 互换。现在 b/c 你似乎想要两种不同的类型(asc/desc),最简单的方法是使用.reverse 来切换方向。否则,'NaN' 将不在您希望它们在排序中的位置。
【解决方案2】:

显然这只是 postgresql 使用NaN 排序的方式

解决方法是使用SQL 语法将NaN 更改为null,然后设置选项以将null 值设置为订购时的最后一个

 DownloadSpeed.order(Arel.sql("nullif(avg, 'NaN') desc nulls last"))

相关问题:

Postgres order column with NaN values

Why do NULL values come first when ordering DESC in a PostgreSQL query?

【讨论】:

    猜你喜欢
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 2022-01-26
    相关资源
    最近更新 更多