如何获取我的 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 表中每个日期的上个月数据的主要内容,如果未能解决你的问题,请参考以下文章

如何获取上周日到周六的日期

如何从访问表中获取选择性记录

如何从 MySql 的表中获取 C# 中即将到来的约会?

获取表中存在的每个日期的第一条和最后一条记录号

Laravel:如何从具有关系的 3 个表中获取数据

如何通过 SQL 语句从两个特定日期(由用户指定)之间的数据库表中获取数据?