PostgreSQL: группировка по дате и получение информации до этой даты - PullRequest
0 голосов
/ 10 ноября 2011

Я пишу запрос, который определяет количество клиентов, владеющих акциями в определенном фонде, сгруппированных по дням транзакций, произошедших с этим фондом.

Итак, моя таблица транзакций:

CREATE TABLE trans(
transID SERIAL PRIMARY KEY,
sin CHAR(9) REFERENCES customer(sin) ON UPDATE CASCADE ON DELETE CASCADE,
fundID INT REFERENCES fund(fundID) NOT NULL,
transDate DATE,
shares INT,
FOREIGN KEY (fundID) REFERENCES fund(fundID) ON UPDATE CASCADE ON DELETE CASCADE
);

Вот мой запрос:

   select f.transdate, count (f.sin) 
   from (select t1.transdate, t1.sin, sum(t2.shares) 
          from fund f natural join trans t1 natural join trans t2 
          where f.fundname='Energy' 
          and t1.sin = t2.sin 
          and t2.transdate <= t1.transdate 
          group by t1.transdate, t1.sin 
          having sum(t2.shares) > 0)as f group by f.transdate 
          order by f.transdate;

Возвращает общее количество клиентов, владеющих акциями в этот день. Однако я также хочу добавить клиентов, которые держали акции в одном и том же фонде все дни раньше.

Так скажем, если я добавлю следующие вставки:

INSERT INTO trans VALUES (DEFAULT, '1', '3', '2011-10-10', 400);
INSERT INTO trans VALUES (DEFAULT, '3', '3', '2011-10-11', 324);
INSERT INTO trans VALUES (DEFAULT, '5', '3', '2011-10-17', 201);
INSERT INTO trans VALUES (DEFAULT, '8', '3', '2011-10-17', 472);

Итак, запрос, который я сформулировал, вернет это:

 transdate  | count 
------------+-------
 2011-10-10 |     1
 2011-10-11 |     1
 2011-10-17 |     2

Однако я бы хотел, чтобы это было так:

 transdate  | count 
------------+-------
 2011-10-10 |     1
 2011-10-11 |     2
 2011-10-17 |     4

Как видите, в конце 2011-10-11 гг. В этом фонде находилось 2 человека и т. Д.

Любая помощь?

1 Ответ

2 голосов
/ 10 ноября 2011

Посмотрите на Функции окна . Вероятно, вы можете создать свой запрос следующим образом:

  • начните с запроса, для которого нужно получить дату и количество

  • из этого результата запросите дату, посчитайте и добавьте столбец с функцией "lag", чтобы получить значение предыдущей строки. Раздел окна может быть пропущен, так как он должен быть на всем наборе строк. Заказ должен быть по дате. Теперь у вас есть дата, количество и счет предыдущей даты (предыдущая строка).

  • из этого результата запроса даты и суммы двух других столбцов

Лучше всего просто немного поэкспериментировать с этим. Oracle называет оконные функции «аналитическими функциями». Вот пример .

...