sql - Postgres 中的时间序列

标签 sql postgresql time-series amazon-redshift

我在 Redshift 上有一个庞大的电子商务交易数据库,大约有 9 亿行,标题与此有些相似。

 id | date_stamp | location | item   | amount
001 | 2009-12-28 | A1       | Apples | 2
002 | 2009-12-28 | A2       | Juice  | 2
003 | 2009-12-28 | A1       | Apples | 1
004 | 2009-12-28 | A4       | Apples | 2
005 | 2009-12-29 | A1       | Juice  | 6
006 | 2009-12-29 | A4       | Apples | 2
007 | 2009-12-29 | A1       | Water  | 7
008 | 2009-12-28 | B7       | Juice  | 14

是否可以在项目中找到趋势?例如,如果我想查看“苹果”在 2009 年 12 月 28 日和 2011 年 12 月 28 日之间在 A4 位置的销售情况,我该怎么做?理想情况下,我想生成一个具有正/负趋势的表格,有点类似于此处的帖子 - Aggregate function to detect trend in PostgreSQL 我在 R 中对小型数据集进行了类似的分析,甚至使用 ggplot 对其进行可视化也不是什么大挑战,但数据库的庞大规模给我带来了一些麻烦,而且查询时间非常长。 例如,

select * 
from fruitstore.sales
where item = 'Apple' and location = 'A1'
order by date_stamp
limit 1000000;

执行大约需要 2500 秒,并且经常超时。 感谢您对此提供的任何帮助。

最佳答案

900M 行对于普通的 Postgres 来说是相当多的。 MPP 变体之一(如 Citus)能够更好地处理它。

另一种选择是更改您存储数据的方式。一个更有效的结构是每个月/项目/位置有 1 行,并存储一个 int 数组。这会将事情减少到 ~300M 行,这更易于管理。我怀疑您的大多数分析工具无论如何都希望将数据视为数组。

关于sql - Postgres 中的时间序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36289541/

相关文章:

sql - 使用超过 2000 万条记录的 SSIS 的最佳增量加载方法

SQL Server 2012 临时表 OBJECT_ID 问题

sql - 用于更新列的递归 PostgreSQL 查询

python - 海量数据集的Django轻量级 "update"

SQL 选择 COUNT(*) > 最小数量

javascript - 遍历 D3 中所有数据点之间的所有值

python - 按间隔合并两个 Pandas 数据帧

sql - 如果存在于文件夹中,则将多个表从 CSV 导入 SQL

sql - 如何从同一个 SELECT 查询插入到两个表

r - 处理 r 中时间序列中的缺失值