Rails根据两个不同的日期订购/排序日期

时间:2016-06-23 14:37:26

标签: ruby-on-rails postgresql

每条记录包含两个字段 - field1和field2。两者都包含日期。

对于到达记录:可能已填写1个字段,而另一个字段可能是2个字段或根本没有。

我希望以最有效的方式根据此订购它们。

因此,它会将field1和field2与记录进行比较,并找出哪一个具有最新日期。然后它将根据此顺序列出所有记录,然后显示不具有任何类型条目的记录。

我按照这样的方式对它进行了排序:

order("CASE WHEN field1 IS NULL THEN 1 ELSE 0 END, field1 desc"

但是当我尝试将字段2引入查询时,它并没有给出我期望的结果。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

按日期GREATEST排序,并添加NULLS LAST以将两个日期的行设置为最后NULL

[local] #= CREATE TEMP TABLE t (d1 date, d2 date, id serial);
CREATE TABLE
Time: 25,122 ms

[local] #= INSERT INTO t VALUES 
    (now(), now() - '1 day'::interval),
    (now(), NULL),
    (NULL, now() - '1 day'::interval),
    (NULL, NULL)
;
INSERT 0 4
Time: 1,194 ms

[local] #= SELECT * FROM t;
┌────────────┬────────────┬────┐
│     d1     │     d2     │ id │
├────────────┼────────────┼────┤
│ 2016-06-23 │ 2016-06-22 │  1 │
│ 2016-06-23 │ (null)     │  2 │
│ (null)     │ 2016-06-22 │  3 │
│ (null)     │ (null)     │  4 │
└────────────┴────────────┴────┘
(4 rows)

[local] #= SELECT * FROM t ORDER BY GREATEST(d1, d2) DESC NULLS LAST;
┌────────────┬────────────┬────┐
│     d1     │     d2     │ id │
├────────────┼────────────┼────┤
│ 2016-06-23 │ 2016-06-22 │  1 │
│ 2016-06-23 │ (null)     │  2 │
│ (null)     │ 2016-06-22 │  3 │
│ (null)     │ (null)     │  4 │
└────────────┴────────────┴────┘
(4 rows)

答案 1 :(得分:0)

我对SQL查询的理解一般是排序将是一个,然后是两个,你不能按一个字段排序而不能按另一个排序。

我这样做的方法是在数据库列中创建第3列(并不是那么难),调用sort_date。编写一个比较date1和date2的after_update方法,并根据您想要的比较条件设置sort_date。 (根据其他代码,可能还需要sort_date的默认值)。然后重新编写您的查询以按sort_date

排序