Как сделать дополнительный выбор для каждой записи результата в postgresql?

Предположим, у меня есть таблица только с двумя столбцами: id, maturity. maturity – это некоторая дата в будущем, до которой конкретная запись не будет доступна. Таким образом, он различен для разных записей, но не обязательно уникален. И со временем меняется количество записей, не дошедших до этой maturity даты.

Мне нужно подсчитать количество записей из такой таблицы, которые были доступны на определенную дату (таким образом, записи, которые не достигли своей зрелости). Поэтому мне в основном нужно присоединиться к этим двум запросам:

SELECT generate_series as date FROM generate_series('2015-10-01'::date, now()::date, '1 day'); 
SELECT COUNT(id) FROM mytable WHERE mytable.maturity > now()::date;

где вместо now()::date нужно поставить запись из сгенерированного ряда. Я уверен, что это должно быть достаточно просто, но я не могу обойти это. Мне нужно, чтобы полученное решение оставалось запросом, поэтому кажется, что я не могу использовать циклы for.

Примеры записей в таблице:

id | maturity
---+-------------------
 1 | 2015-10-03
 2 | 2015-10-05
 3 | 2015-10-11
 4 | 2015-10-11

Ожидаемый результат:

    date    | count 
------------+-------------------
 2015-10-01 |                 4 
 2015-10-02 |                 4
 2015-10-03 |                 3 
 2015-10-04 |                 3 
 2015-10-05 |                 2
 2015-10-06 |                 2 

ПРИМЕЧАНИЕ. Это количество не уменьшается постоянно, так как добавляются новые записи, и это количество увеличивается.


person Denys S.    schedule 10.12.2015    source источник
comment
И вывод основан на каком вводе?   -  person a_horse_with_no_name    schedule 10.12.2015
comment
Я предоставил более исчерпывающий образец данных.   -  person Denys S.    schedule 10.12.2015


Ответы (2)


Вы должны использовать поля внешнего запроса в предложении WHERE подзапроса. Это можно сделать, если подзапрос находится в предложении SELECT внешнего запроса:

SELECT generate_series,
  (SELECT COUNT(id)
  FROM mytable
  WHERE mytable.maturity > generate_series)
FROM generate_series('2015-10-01'::date, now()::date, '1 day');

Дополнительная информация: http://www.techonthenet.com/sql_server/subqueries.php

person Atomixx    schedule 10.12.2015

Я думаю, вы хотите сгруппировать свои данные по дате погашения.

Проверь это:

select maturity,count(*) as count 
from your_table group by maturity;
person Abhishek Ginani    schedule 10.12.2015