2016-06-23 8 views
0

各レコードにはfield1とfield2という2つのフィールドが含まれています。両方とも日付を含んでいます。Railsは2つの異なる日付に基づく注文/ソート

リーチレコードの場合:1つのフィールドが記入されている可能性があります。別のフィールドは2つのフィールドか、まったくないかもしれません。

私はこれに基づいて最も効率的な方法で注文したいと思います。

したがって、レコードのフィールド1とフィールド2を比較し、最新の日付を持つレコードを探します。次に、これに基づいてすべてのレコードを順番にリストし、次に何らかのエントリを持たないレコードを表示します。

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

をしかし、私がしようとすると、クエリにフィールド2を導入するとき、それは私に私が期待する結果が得られていません:

私はそれだけでフィールド1本などに並べ替えられていました。

アイデア?

答えて

1

順ソート、そして最後NULLに設定された日付の両方を持つ行を持っているNULLS LASTを追加するには:これは答えの

[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) 
0

SQLクエリの一般的な理解では、ソートは1つで、2つは1つのフィールドで並べ替えることはできません。

私のやり方は、sort_dateを呼び出して、データベース列に3番目の列を作成することです。 のdate1とdate2を比較し、希望の比較条件に基づいてsort_dateを設定するメソッドを記述します。 (他のコードによっては、sort_dateのデフォルト値も必要な場合があります)。それからちょうど再書き込みクエリの日付のGREATESTによってsort_date

+0

ってどんなのですか? downvotedになる前にそれを削除してください。 –

関連する問題