Sql Postgres中的时间序列

Sql Postgres中的时间序列,sql,postgresql,time-series,amazon-redshift,Sql,Postgresql,Time Series,Amazon 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 | 2

我有一个巨大的红移电子商务交易数据库,大约有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位置“苹果”在销售方面的表现,我会怎么做?理想情况下,我希望生成一个具有正/负趋势的表,有点类似于这里的帖子- 我在R中对小数据集进行了类似的分析,甚至使用ggplot可视化也不是什么大挑战,但数据库的巨大规模给我带来了一些麻烦,查询时间也非常长。 比如说,

select * 
from fruitstore.sales
where item = 'Apple' and location = 'A1'
order by date_stamp
limit 1000000;
执行大约需要2500秒,并且经常超时。
非常感谢您在这方面提供的帮助。

要在SQL查询中筛选结果,您可以使用
WHERE
子句:

SELECT *
FROM myTable
WHERE
     item='Apple' AND
     date_stamp BETWEEN '2009-12-28' AND '2011-12-28' AND
     location = 'A4'
使用聚合函数,可以汇总某个位置两个日期之间的水果销售,例如:

SELECT item as "fruit", sum(amount) as "total"
FROM myTable
WHERE     
     date_stamp BETWEEN '2009-12-28' AND '2011-12-28' AND
     location = 'A4'
GROUP BY item

你问苹果公司如何“收费”的问题并不可怕,但使用
WHERE
子句和聚合函数(不要忘记分组依据)可能是你需要解决的问题。

要过滤SQL查询中的结果,你可以使用
WHERE
子句:

SELECT *
FROM myTable
WHERE
     item='Apple' AND
     date_stamp BETWEEN '2009-12-28' AND '2011-12-28' AND
     location = 'A4'
使用聚合函数,可以汇总某个位置两个日期之间的水果销售,例如:

SELECT item as "fruit", sum(amount) as "total"
FROM myTable
WHERE     
     date_stamp BETWEEN '2009-12-28' AND '2011-12-28' AND
     location = 'A4'
GROUP BY item

你问苹果公司的“进展如何”这一问题并不是很糟糕,但使用
WHERE
子句和聚合函数(不要忘记你的分组依据)可能是你需要解决的问题。

900M行对于股票博士后来说是一个相当棘手的问题。其中一种MPP变体(如Citus)能够更好地处理它


另一个选择是更改存储数据的方式。更有效的结构是每个月/项目/地点有一行,并存储一个整数数组。这将把行数减少到约3亿行,这将更易于管理。我怀疑您的大多数分析工具都希望将数据视为一个数组。

900M行对于stock Postgres来说是一个需要处理的问题。其中一种MPP变体(如Citus)能够更好地处理它

另一个选择是更改存储数据的方式。更有效的结构是每个月/项目/地点有一行,并存储一个整数数组。这将把行数减少到约3亿行,这将更易于管理。我怀疑您的大多数分析工具都希望将数据视为数组。

请查看。它们非常适合这种类型的用例。它们对我来说有点难以理解,但可以避免SQL带来的严重扭曲

这将显示在您感兴趣的时期内,每天售出多少苹果:

select date_trunc('day', date_stamp) as day, count(*) as sold
from fruitstore.sales
where item = 'Apple' and location = 'A4'
    and date_stamp::date >= '2009-12-28'::date and date_stamp::date <= '2011-12-28'::date
group by 1 order by 1 asc
下面是一个关于性能提示的示例。

请查看。它们非常适合这种类型的用例。它们对我来说有点难以理解,但可以避免SQL带来的严重扭曲

这将显示在您感兴趣的时期内,每天售出多少苹果:

select date_trunc('day', date_stamp) as day, count(*) as sold
from fruitstore.sales
where item = 'Apple' and location = 'A4'
    and date_stamp::date >= '2009-12-28'::date and date_stamp::date <= '2011-12-28'::date
group by 1 order by 1 asc

这里是一个关于性能提示的示例。

您所说的“苹果”在2009-12-28和2011-12-28之间的表现到底是什么意思,位置A4?向我们展示您的查询,您期望的结果是什么以及需要多长时间。性能问题应包括
EXPLAIN ANALYZE
和一些关于表大小、索引、当前时间性能、期望时间等的信息。
Slow
是一个相对术语,我们需要一个实际值进行比较。很抱歉,我将对其进行编辑以使问题更清楚。我的意思是,“苹果”在每天的销售额方面表现如何。
select*
你能详细说明你希望结果集显示什么吗?这是一个周期汇总,按月汇总(金额)组,是其他的吗?您所说的“苹果”在2009-12-28和2011-12-28之间的表现是什么意思,位置A4?向我们展示您的查询,您期望的结果是什么,需要多长时间。性能问题应包括
EXPLAIN ANALYZE
和一些关于表大小、索引、当前时间性能、期望时间等的信息。
Slow
是一个相对术语,我们需要一个实际值进行比较。很抱歉,我将对其进行编辑以使问题更清楚。我的意思是,“苹果”在每天的销售额方面表现如何。
select*
你能详细说明你希望结果集显示什么吗?它是否是一个周期聚合,按月求和(金额)组,是否还有其他原因?OP表示数据处于红移状态,TOP表示数据处于红移状态