Вопрос в том, зачем вам нужен «вложенный запрос»?Нам не нужно использовать «вложенные запросы», это мышление в мышлении SQL, а не в реляционной алгебре.С помощью реляционной алгебры мы выводим отношения и используем выходные данные одного отношения в качестве входных данных для другого, поэтому справедливо следующее:
points = Table(:points, {:as => 'sorted'}) # rename in the options hash
final_points = points.order('timestamp DESC').group(:client_id, :timestamp).project(:client_id, :timestamp)
Лучше всего, если мы перестанем переименовывать в arel, если это не будет абсолютно необходимо.
Здесь проекция client_id AND timestamp ОЧЕНЬ важна, так как мы не можем проецировать все домены из отношения (т.е. отсортированные. *).Вы должны специально спроектировать все домены, которые будут использоваться в операции группировки для отношения.Причина в том, что для * нет значения, которое бы отчетливо представляло сгруппированный client_id.Например, скажем, у вас есть следующая таблица
client_id | score
----------------------
4 | 27
3 | 35
2 | 22
4 | 69
Здесь, если вы группируете, вы не можете выполнить проекцию в области оценки, потому что значение может быть 27 или 69, но вы можете спроецировать сумму (оценку)
Вы можете проецировать в группу только те атрибуты домена, которые имеют уникальные значения (обычно это агрегированные функции, такие как sum, max, min).С вашим запросом не будет иметь значения, если точки были отсортированы по отметке времени, потому что в конце они будут сгруппированы по client_id.порядок отметок времени не имеет значения, поскольку нет единой отметки времени, которая могла бы представлять группировку.
Пожалуйста, дайте мне знать, как я могу помочь вам с Арелом.Кроме того, я работаю над серией обучения для людей, чтобы использовать Arel в своей основе.Первая серия статей: http://Innovative -Studios.com / # pilot Я могу сказать, что вы начинаете знать, как, поскольку вы использовали Таблицу (: точки), а не модель ActiveRecord Точка.