【问题标题】:Rails order / sort dates based on two different datesRails 根据两个不同的日期对日期进行排序/排序
【发布时间】:2016-06-23 14:37:26
【问题描述】:

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

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

我想以此为基础以最有效的方式订购它们。

所以它会比较 field1 和 field2 的记录并找出哪个记录​​的日期最新。然后它会根据这个顺序列出所有记录,然后显示没有任何条目的记录。

我只对 field1 进行了这样的排序:

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

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

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails postgresql


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这是什么答案?在你被否决之前删除它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 2017-05-12
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      相关资源
      最近更新 更多