如何获取我的 SQL/Vertica 表中每个日期的上个月数据
Posted
技术标签:
【中文标题】如何获取我的 SQL/Vertica 表中每个日期的上个月数据【英文标题】:How to fetch last month's data for every date in my SQL/Vertica table 【发布时间】:2014-02-20 15:20:35 【问题描述】:有几篇较早的帖子有类似的问题,但没有一个符合我的具体要求,包括这个 (Current month and last month data in single row)。
我有一个包含以下列的 Vertica 表(比如 CompanyData):
company_id | date | shares
PK 是一个复合的 'company_id,date'。
现在,使用 add_months 函数获取特定日期或日期范围的上个月数据非常简单。比如:
select *
from CompanyData
where company_id = 'ABC12' and date = add_months('20121205', -1)
order by company_id, date;
但是,当我想为整个表(所有公司、所有日期)做同样的事情时,我会想到自我加入。
有没有办法避免连接并仍然为整个表检索此信息?
如果您需要任何进一步的信息,请告诉我。
示例表数据:
公司ID |日期 |分享
ABC12 | 20120101 | 253.77 ABC12 | 20120102 | 253.77 ABC12 | 20120103 | 254.59 ABC12 | 20120104 | 254.12 . . . ABC12 | 20120201 | 257.90 ABC12 | 20120202 | 257.41 . . XYZ45 | 20120101 | 312.45 XYZ45 | 20120102 | 314.25 XYZ45 | 20120103 | 311.27 XYZ45 | 20120104 | 314.34 . . . XYZ45 | 20120201 | 315.11 XYZ45 | 20120202 | 316.71 . .
如前所述,我们拥有许多公司的每日频率数据。
所需的输出类似于:
公司ID |日期 |分享
ABC12 | 20120101 |空 ABC12 | 20120102 |空 . . ABC12 | 20120201 | 253.77 ABC12 | 20120202 | 253.77 ABC12 | 20120203 | 254.59 ABC12 | 20120204 | 254.12 . . . XYZ45 | 20120101 |空 XYZ45 | 20120102 |空值 . . XYZ45 | 20120201 | 312.45 XYZ45 | 20120202 | 314.25 XYZ45 | 20120203 | 311.27 XYZ45 | 20120204 | 314.34
感谢您的帮助!
【问题讨论】:
你对这张桌子有什么预测吗? 是的,我们确实有预测。 你能提供一些样本数据和想要的结果吗? 【参考方案1】:您可以通过自加入来做到这一点:
select cd.*
from CompanyData cd left outer join
CompanyData cdprev
on cd.company_id = cdprev.company_id and
cdprev.date = add_months(cd.date, -1)
where cd.company_id = 'ABC12'
order by cd.company_id, cd.date;
如果您每个月只有一条记录,可能会有更简单的解决方案。
【讨论】:
谢谢戈登!我一直在寻找自联接以外的东西,因为对于具有数十亿行的表来说,这可能会变得非常昂贵。此外,此表存储每日数据;是的,如果允许我使用 Google Analytics(分析),每月一次会让我的生活变得更简单! @user2492832 。 . .自联接性能可能比您想象的要好。如果您从选择中删除*
会有所帮助。这确实会减慢列式数据库的速度。
嗨,戈登,我想补充一下我之前的查询。假设我们有另一个表 CompanyPrices 我需要加入到 PK 上的 CompanyData 以获取“价格”列。如果我现在想从这个结果数据集中提取上个月的数据,最好的方法是什么?
澄清一下,股票(来自 CompanyData)和价格(来自 CompanyPrices)都需要获取上个月的数据,同样适用于连接数据集中的每个条目。以上是关于如何获取我的 SQL/Vertica 表中每个日期的上个月数据的主要内容,如果未能解决你的问题,请参考以下文章