【发布时间】:2018-08-19 18:09:10
【问题描述】:
我在 Postgres 中以 1 分钟为增量存储了 OHLCV 股票数据。
我正在尝试将数据重新采样为 5 分钟间隔。我已使用此answer 生成以下 SQL 查询。
这是生成的 SQL 查询:
SELECT
avg('open') AS open,
avg('high') AS high,
avg('low') AS low,
avg('close') AS close,
avg('volume') AS volume,
avg('open_interest') AS open_interest,
to_timestamp(floor(EXTRACT(epoch FROM 'timestamp') / 300) * 300) AS interval_alias
WHERE 'symbol'='IRFC-N8' GROUP BY interval_alias
我收到此错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) function avg(unknown) is not unique
LINE 1: SELECT avg('open') AS open, avg('high') AS high, avg('low') ...
^
HINT: Could not choose a best candidate function. You might need to add explicit type casts.
你能告诉我出了什么问题吗?
编辑 1:为更好地呈现而格式化的代码。
编辑 2:根据下面的答案,我需要在 avg 函数的参数周围使用双引号。我正在使用 sqlalchemy 生成表达式,它正在创建单引号字符串。这是生成平均查询的代码部分:
cols = list()
cols.append(func.avg(self.p.open).label(self.p.open))
cols.append(func.avg(self.p.high).label(self.p.high))
cols.append(func.avg(self.p.low).label(self.p.low))
cols.append(func.avg(self.p.close).label(self.p.close))
cols.append(func.avg(self.p.volume).label(self.p.volume))
cols.append(func.avg(self.p.openinterest).label(self.p.openinterest))
seconds = self._get_seconds()
cols.append(func.to_timestamp(func.floor(func.extract("epoch", "timestamp") / seconds) * seconds).label("interval_alias"))
SqlAlchemy 应该知道更好地使用双引号,但它会生成单引号。
【问题讨论】:
-
Postgres 中的单引号用于字符串文字。未定义字符串的
AVG。请改用双引号 (AVG("open"))。 -
顺便说一句,使用
AVG()获取 OHLCV 数据对我来说没有意义。我会使用MAX("high"), MIN("low"), ... first open of the 5-min, ... last close of the 5-min, SUM("volume")。
标签: postgresql sqlalchemy time-series