pl / python получение и вывод набора строк - PullRequest
1 голос
/ 30 января 2012

Описание проблемы : Я пытаюсь определить агрегатор pl / python, который получает набор строк и возвращает набор строк для каждого набора строк, сгенерированных из запроса. Входной набор строк должен быть группой, созданной с помощью оператора group by в запросе. Я пытаюсь найти свой путь через синтаксис, но мне тяжело с этим. Функции pl / pgsql приветствуются, но, боюсь, им может не хватить выразительной силы для этого.

Описание контекста : у меня есть таблица с тремя столбцами: символ тикера, дата и значение. Я пытаюсь вычислить macd для каждого символа тикера и даты в соответствии со значениями, которые у меня есть. Я могу сгруппировать и отсортировать таблицу по дате, тогда все, что мне нужно будет сделать, - это для каждой группы вычислить значение агрегатора для этой даты в соответствии с текущим значением для каждого тикера и предыдущим значением для агрегатора, что, как я полагаю, сохранит в SD, тогда все, что мне нужно будет вернуть, - это набор строк с этим значением и, возможно, тикер для объединения, но я думаю, что должна быть возможность сохранить порядок и сэкономить время объединения.

Вот как будет создана таблица:

create table candles(ticker text, day date, value real,
  primary key (ticker, day));

Здесь вы можете найти пример в Java (pseudocode-ish), который показывает, как следует обрабатывать группы (по дням) после сортировки по тикеру. В Java эти группы представлены в виде ArrayList, поскольку они отсортированы по тикеру, одна и та же позиция соответствует одному и тому же тикеру (база данных проверяется при генерации, поэтому записи отсутствуют), и поскольку они группируются по дням, каждая группа имеет значения для в тот же день и на следующий день, чем предыдущий звонок.

PD: Я также добавил код для вычисления MACD в pl / pgsql , но для этого я делаю заказ по тикеру и по дню, я хотел бы заказать по дням и сделать все вычисления для всех тикеры в цикле, потому что это должно быть более эффективным, особенно учитывая, что конечный результат должен быть упорядочен по дням, чтобы его можно было использовать таким образом.

Если есть что-то, что не совсем понятно, пожалуйста, спросите меня, я стараюсь быть ясным и лаконичным.

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 02 марта 2012

Извините, если описание сбило с толку.Я решил проблему, с которой столкнулся:

  1. , создавая массивы из значений, которые я хотел сгруппировать, используя подзапрос.select array_agg(x) from y group by z order by v;
  2. создание функции, которая принимает массивы, просто добавив [] к описанию параметров.И агрегатор для этой функции.
  3. с использованием агрегатора и подзапроса в конечном запросе.

Это было довольно легко, но я не знал о типе массива и всехего возможности.Извините и спасибо.

0 голосов
/ 31 января 2012

Я сделаю снимок в темноте теперь, когда посмотрел на то, что вы пытаетесь сделать.

Select symbol, value
from a_table_with_three_columns
where date = '2012-01-05'

Только несколько советов по «переполнению стека» для вас ... давая нам имена столбцов как «значение» или «дата» вместо ваших реальных имен столбцов или пренебрегая именами таблиц, мы можем только давать глупый псевдокод, как описано выше это не будет работать напрямую в вашей БД. В будущем, дайте нам имя вашей таблицы и столбцы ... предпочтительно, таблицу create.

Так что выше sql даст вам все записи и их стоимость в этот день. (Я предполагаю, что ваши данные - один день, а не часовые интервалы). Теперь мы можем взять этот запрос и присоединить его к себе, за исключением предыдущего дня:

select a.symbol, a.value - b.value
(Select symbol, value
from a_table_with_three_columns
where date = '2012-01-05') a
inner join
(Select symbol, value
from a_table_with_three_columns
where date = '2012-01-05')b
on a.symbol = b.symbol

Это даст вам список символов и разницу между значениями за два дня. С небольшими изменениями вы можете сделать это соединение с функцией датирования и включить дату в ваш набор данных. Это вернет символ, день и разницу значений от предыдущего дня. Я также могу пройти через эту часть, хотя я был бы признателен за более качественные данные схемы от себя, поэтому мне не нужно использовать 'a_table_with_three_columns';)

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