我继续为以下查询获取资源。我试过在批处理模式和命令行中运行,似乎没有任何工作。有人有想法吗?
SELECT num, extid, amount, note, balance
FROM
(
SELECT row_number() over(partition by extid order by stamp) as num
, extid, stamp, ds, amount, note, balance
FROM monte.ledger2_trailing_21d
WHERE ds >= '2015-02-09'
ORDER BY extid, stamp
)
WHERE num <= 10
limit 300
答案 0 :(得分:4)
这是一个看似昂贵的查询;在类似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行中的最小标记。即使任何给定MIN()
的行数少于10行,使用extid
也可以正常工作。
中间子选择查找每个tenth_stamp
的最大extid
。这是extid
的第十个总标记。然后,外部SELECT可以将结果限制为只有stamp
的行,这些行在stamp
的最新extid
内,为您提供所需的结果。
执行时,总共需要4个阶段。它不会快速运行,但不会在一个位置需要大量数据。希望有所帮助!