这是一个看似昂贵的查询;在类似 SQL 的环境中,时间序列分析总是很困难。您编写的 PARTITION BY 子句要求单个 extid 的所有数据都存在于单个机器的内存中,这会使其过载并导致资源超出错误。
您可以通过使用ROWS 子句来限制您的分区范围来缓解此 RAM 要求。这是一个例子:
SELECT extid, stamp, ds, amount, note, balance
FROM (
SELECT
extid, stamp, ds, amount, note, balance,
MAX(tenth_stamp) OVER(PARTITION BY extid) AS target_stamp
FROM (
SELECT extid, stamp, ds, amount, note, balance,
MIN(stamp) OVER (
PARTITION BY extid
ORDER BY stamp DESC
ROWS BETWEEN CURRENT ROW AND 9 FOLLOWING
) AS tenth_stamp
FROM
[monte.ledger2_trailing_21d]
WHERE ds >= '2015-02-09'
)
)
WHERE stamp >= target_stamp
ORDER BY extid, stamp
LIMIT 300
最里面的子选择提取您的数据和一个字段tenth_stamp,该字段在检查的 10 行中拥有最少的标记。即使任何给定的extid 的行数少于 10 行,使用 MIN() 也可以进行这项工作。
中间的子选择为每个extid 找到最大的tenth_stamp。这是extid 的第十总邮票。然后,外部 SELECT 可以将结果限制为仅在最近的十个 stamp 中具有 stamp 的行,它们各自的 extid,为您提供所需的结果。
执行时,总共需要 4 个阶段。它不会运行得很快,但从不需要在单个位置存储大量数据。希望对您有所帮助!