В следующем запросе используется DISTINCT ON
:
SELECT DISTINCT ON (year) c.year, wins, worldcupwin, c.team
FROM coach AS c
INNER JOIN team AS t ON c.team = t.team AND c.year = t.year
WHERE c.year > 1999
ORDER BY year, wins DESC
для возврата записей с наибольшим числом побед в год
year wins worldcupwin team
---------------------------------
2000 4 Y a
2003 5 N b
Фильтрация команд, которые не выиграть кубок мира:
SELECT year, team
FROM (
SELECT DISTINCT ON (year) c.year, wins, worldcupwin, c.team
FROM coach AS c
INNER JOIN team AS t ON c.team = t.team AND c.year = t.year
WHERE c.year > 1999
ORDER BY year, wins DESC) AS t
WHERE t.worldcupwin = 'Y'
ORDER BY year, wins DESC
дает ожидаемый результат:
year team
-------------
2000 a
Если вы хотите получить список, просто вызовите list () для вашего объекта-генератора.
Объект-генератор в python - это что-то вроде отложенного списка. Элементы оцениваются только после их итерации. (Таким образом, список вызовов для него оценивает все из них.)
Например, вы можете сделать:
>>> def f(x):
... print "yay!"
... return 2 * x
>>> g = (f(i) for i in xrange(3)) # generator comprehension syntax
>>> g
<generator object <genexpr> at 0x37b6c0>
>>> for j in g: print j
...
yay!
0
yay!
2
yay!
4
Посмотрите, как вычисляется f только при итерации по нему. Вы можете найти отличный материал по этой теме здесь: http://www.dabeaz.com/generators/
Генератор - это своего рода итератор. Итератор является своего рода итеративным объектом, и, как и любой другой итерируемый,
Вы можете перебирать каждый элемент, используя цикл for:
for vote in Vote.objects.get_top(myModel, limit=10, reversed=False):
print v.name, vote
Если вам нужен доступ к элементам по индексу, вы можете преобразовать его в список:
top_votes = list(Vote.objects.get_top(myModel, limit=10, reversed=False))
print top_votes[0]
Тем не менее, вы можете перебирать определенный экземпляр итератора только один раз (в отличие от более общего итерируемого объекта, такого как список):
>>> top_votes_generator = Vote.objects.get_top(myModel, limit=3)
>>> top_votes_generator
<generator object at 0x022f7AD0>
>>> list(top_votes_generator)
[<Vote: a>, <Vote: b>, <Vote: c>]
>>> list(top_votes_generator)
[]
Подробнее о создании собственных генераторов см. http: // docs. python.org/tutorial/classes.html#generators
Hmmmm
I've read this and this and things are quiet clear now;
Actually i can convert generators to list by just doing
mylist=list(myGenerator)