2016-06-23 2 views
0

Каждая запись содержит два поля - field1 и field2. Оба содержат даты.Rails порядок/сортировка даты на основе двух разных дат

Для записи цели: возможно, поле было заполнено 1, а для другого это могло быть 2 поля или вообще ничего.

Я хотел бы наиболее эффективным способом упорядочить их на основе этого.

Таким образом, оно сравнило бы поле1 и поле2 для записи и определило, какая из них имеет самую последнюю дату. Затем он будет перечислять все записи в порядке, основанном на этом, а затем отображать записи, которые не имеют какой-либо записи.

У меня было сортируется только за field1 так:

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

Но когда я пытаюсь ввести поле 2 в запросе он не дает мне результаты, которые я хотел бы ожидать.

Любые идеи?

ответ

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

Мое понимание SQL-запросов в целом состоит в том, что сортировка будет одной, а затем двумя, вы не можете сортировать по одному полю, чем сортировать по другому.

Способ, которым я должен был это сделать, состоит в создании третьего столбца (не так уж и тяжелого) в столбце базы данных, вызывающего sort_date. Напишите метод after_update, который сравнивает date1 и date2 и устанавливает sort_date на основе условия сравнения, которое вы хотите. (Также может потребоваться значение по умолчанию для sort_date в зависимости от другого кода). Тогда просто переписать запрос для сортировки sort_date

+0

Какой ответ это? Удалите его, прежде чем вы получите downvoted. –

Смежные вопросы