【问题标题】:How do I order table columns by the most recent date?如何按最近日期对表格列进行排序?
【发布时间】:2016-03-28 17:52:23
【问题描述】:

我有email_invitations 表,其中包含三个日期时间列sent_atopened_atrsvped_at。如何按日期升序对三列进行排序(最近的在顶部)?

我在 rails 中使用default_scope

default_scope { order('sent_at ASC' }

这就是我所拥有的

EmailInvitation
id: 1, sent_at: "2016-03-24", opened_at: "2016-03-25", rsvped_at: "2016-03-25"
id: 2, sent_at: "2016-03-24", opened_at: "2016-03-25", rsvped_at: "2016-04-01"
id: 3, sent_at: "2016-03-23", opened_at: "2016-03-24", rsvped_at: nil
id: 4, sent_at: "2016-03-29", opened_at: nil, rsvped_at: nil

使用EmailInvitation.order(sent_at: :asc, opened_at: :asc, rspved_at: :asc) 看起来它首先排序sent_at,然后是opens_at,然后是rsvped_at。

id: 4, sent_at: "2016-03-29", opened_at: nil, rsvped_at: nil
id: 1, sent_at: "2016-03-24", opened_at: "2016-03-25", rsvped_at: "2016-03-25"
id: 2, sent_at: "2016-03-24", opened_at: "2016-03-25", rsvped_at: "2016-04-01"
id: 3, sent_at: "2016-03-23", opened_at: "2016-03-24", rsvped_at: nil

但我真正想要的是最近日期的内容会在顶部,所以我需要以某种方式加入所有列,这样它就不会查看列名,而只是查看日期。

id: 2, sent_at: "2016-03-24", opened_at: "2016-03-25", rsvped_at: "2016-04-01"
id: 4, sent_at: "2016-03-29", opened_at: nil, rsvped_at: nil
id: 1, sent_at: "2016-03-24", opened_at: "2016-03-25", rsvped_at: "2016-03-25"
id: 3, sent_at: "2016-03-23", opened_at: "2016-03-24", rsvped_at: nil

【问题讨论】:

  • 既然您对 Athonys 的回答不满意:您能展示一些示例数据和预期结果吗?
  • 编辑:需要升序,而不是降序

标签: sql ruby-on-rails ruby rails-activerecord


【解决方案1】:

大概:

  1. sent_at 永远不会是 nil
  2. 如果opened_atnil,那么rsvped_at 也是。
  3. sent_at 将始终最多为opened_atopened_at 将是nil
  4. 如果opened_at 不是nil,那么它最多总是rsvped_atrsvped_at 将是nil

这意味着您确实在尝试按第一个非nil 条目进行排序

[rsvped_at, opened_at, sent_at]

对吗?这与尝试在该列表中选择第一个非 NULL 条目并按其排序相同。使用 COALESCE 很容易表达:

order('coalesce(rsvped_at, opened_at, sent_at) desc')

SQL COALESCE 函数只返回其参数中第一个(从左到右)非 NULL 的参数。

【讨论】:

    猜你喜欢
    • 2021-10-31
    • 2020-01-15
    • 1970-01-01
    • 2018-10-02
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    相关资源
    最近更新 更多