Агрегатный подзапрос и внешний запрос - PullRequest
0 голосов
/ 29 мая 2020

У меня есть два запроса в Django, которые работают независимо, но я не могу связать их вместе:

q1 = M.objects.values('f1', 'f2').annotate(Min('timestamp')).filter(timestamp__min__gte=datetime.datetime(2020, 4, 30, 11, 6, 15, 998799)).values('f1', 'f2')
q2 = M.objects.values('f2').annotate(Count('f1'))

Это SQL из первого запроса:

SELECT `t`.`f1_id`, `t`.`f2` FROM `t` GROUP BY `t`.`f1_id`, `t`.`f2` HAVING MIN(`t`.`timestamp`) >= '2020-04-30 11:06:15.998799' ORDER BY NULL

И со второго:

SELECT `t`.`f2`, COUNT(`t`.`f1_id`) AS `f1__count` FROM `t` GROUP BY `t`.`f2` ORDER BY NULL

Если я попытаюсь связать их вместе:

q3 = q1.values('f2').annotate(Count('f1'))

я получу:

SELECT `t`.`f2`, COUNT(`t`.`f1_id`) AS `f1__count` FROM `t` GROUP BY `t`.`f2` HAVING MIN(`t`.`timestamp`) >= 2020-04-30 11:06:15.998799 ORDER BY NULL

Это не то, что я хочу. Я хочу:

SELECT `t`.`f2`, COUNT(`t`.`f1_id`) AS `f1__count` FROM (SELECT `t`.`f1_id`, `t`.`f2` FROM `t` GROUP BY `t`.`f1_id`, `t`.`f2` HAVING MIN(`t`.`timestamp`) >= '2020-04-30 11:06:15.998799' ORDER BY NULL) AS `t` GROUP BY `t`.`f2` ORDER BY NULL

Я не уверен, как добиться этого на чистом python / Django, с Raw SQL или с RawQuerySet.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...