Sql 如何按最近日期对表列进行排序?
我有Sql 如何按最近日期对表列进行排序?,sql,ruby-on-rails,ruby,rails-activerecord,Sql,Ruby On Rails,Ruby,Rails Activerecord,我有电子邮件邀请表,表中有三个日期时间列,发送,打开,以及回复。如何按日期按升序(最新的在顶部)对这三列进行排序 我正在rails中使用default\u范围: 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",
电子邮件邀请
表,表中有三个日期时间列,发送
,打开
,以及回复
。如何按日期按升序(最新的在顶部)对这三列进行排序
我正在rails中使用default\u范围
:
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(发送地址::asc,打开地址::asc,rspved地址::asc)
它看起来像是先对发送的进行排序,然后在打开,然后在rsvped地址排序
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
大概是:
在
处发送的\u将永远不会是nil
opened\u是nil
则
处的rsvped\u也是如此
sent\u at
将始终最多打开opened\u at
或opened\u at
将为nil
opened\u at
不是nil
,那么它将始终最多rsvped\u at
或rsvped\u at
将是nil
nil
条目进行排序
[rsvped_at, opened_at, sent_at]
对吧??这与尝试在该列表中选择第一个非空条目并按其排序相同。使用COALESCE表达起来非常简单:
order('coalesce(rsvped_at, opened_at, sent_at) desc')
SQL COALESCE函数只返回其第一个(从左到右)非空参数。因为您对Athony不满意,所以回答:您能显示一些示例数据和预期结果吗?编辑:需要升序,而不是降序