У меня есть два запроса в 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.