【发布时间】:2021-12-30 07:47:35
【问题描述】:
例如,我有一个股票表:
CREATE TABLE Ticks
(
ts TIMESTAMP,
Stock varchar(10),
Bid float
);
INSERT INTO Ticks VALUES('2011-07-12 10:23:54', 'abc', 10.12);
INSERT INTO Ticks VALUES('2011-07-12 10:23:58', 'abc', 10.34);
INSERT INTO Ticks VALUES('2011-07-12 10:23:59', 'abc', 10.75);
INSERT INTO Ticks VALUES('2011-07-12 10:25:15', 'abc', 11.98);
INSERT INTO Ticks VALUES('2011-07-12 10:25:16', 'abc');
INSERT INTO Ticks VALUES('2011-07-12 10:25:22', 'xyz', 45.16);
INSERT INTO Ticks VALUES('2011-07-12 10:25:27', 'xyz', 49.33);
INSERT INTO Ticks VALUES('2011-07-12 10:31:12', 'xyz', 65.25);
INSERT INTO Ticks VALUES('2011-07-12 10:31:15', 'xyz');
COMMIT;
我想在 Vertica 中通过一次查询计算所有股票的移动平均线。
这是只针对一只股票的方法(根据 Vertica 网站):
SELECT
ts, bid,
AVG(bid) OVER (ORDER BY ts
RANGE BETWEEN INTERVAL '40 seconds' PRECEDING AND CURRENT ROW)
FROM
ticks
WHERE
stock = 'abc'
GROUP BY
bid, ts
ORDER BY
ts;
输出:
ts | bid | ?column?
---------------------+-------+------------------
2011-07-12 10:23:54 | 10.12 | 10.12
2011-07-12 10:23:58 | 10.34 | 10.23
2011-07-12 10:23:59 | 10.75 | 10.4033333333333
2011-07-12 10:25:15 | 11.98 | 11.98
2011-07-12 10:25:16 | | 11.98
(5 rows)
DROP TABLE Ticks CASCADE;
如果我尝试选择所有股票:
SELECT
stock, ts, bid,
AVG(bid) OVER (ORDER BY ts
RANGE BETWEEN INTERVAL '40 seconds' PRECEDING AND CURRENT ROW)
FROM
ticks
GROUP BY
stock, bid, ts
ORDER BY
stock, ts;
我得到一个错误的结果。
我该如何解决这个问题?
【问题讨论】:
标签: sql vertica moving-average