2016-11-10 5 views
3

Для примера, я хотел бы, чтобы выбрать идентификатор с максимальной датой группы по категориям, результат: 7, 2, 6Как выбрать идентификатор с максимальной датой по категориям в запросе Ecto с Phoenix?

id category date 
1 a   2013-01-01 
2 b   2013-01-03 
3 c   2013-01-02 
4 a   2013-01-02 
5 b   2013-01-02 
6 c   2013-01-03 
7 a   2013-01-03 
8 b   2013-01-01 
9 c   2013-01-01 

Это SQL, я думаю, может работать:

SELECT * FROM Table1 t1 
JOIN 
(
    SELECT category, MAX(date) AS MAXDATE 
    FROM Table1 
    GROUP BY category 
) t2 
ON T1.category = t2.category 
AND t1.date = t2.MAXDATE 

Но как перевести это в запрос на Ecto?

+0

Unrelated, но: с Postgres, используя 'отличие от()' или запрос с использованием оконных функций будет намного быстрее, чем с помощью автообъединения с 'группы по . –

ответ

1

Проблема со многими фреймворками заключается в том, что они не могут захватить все сложности инструкции SQL SELECT. Самое простое решение: обернуть сложный запрос в виде:

CREATE VIEW my_complex_view AS 
    SELECT * FROM Table1 t1 
    JOIN (
    SELECT category, MAX(date) AS maxdate 
    FROM Table1 
    GROUP BY category) t2 
    ON t1.category = t2.category AND t1.date = t2.maxdate; 

Теперь у вас есть простой запрос (SELECT * FROM my_complex_view), который любая приличная структура может легко справиться.

0

Вы можете использовать subquery функция

subquery = from t in "Table1" 
     |> select([t], %{categoty: t.category, max_date: max(t.date)}) 
     |> group_by([t], t.category) 

from t in "Table1" 
     |> join(:inner, [u], t in subquery(subquery), t.category == u.category and t.max_date == u.date) 
     |> Repo.all