Sql Postgres中的时间序列
我有一个巨大的红移电子商务交易数据库,大约有9亿行,标题与此类似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
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表示数据处于红移状态