我有历史股票价格数据,如下所示。我想生成一个新表,每个自动收报机有一行,包含最近一天的价格和前一天的价格。最好的方法是什么?我的数据库是Postgres。
+---------+------------+------------+
| ticker | price | date |
+---------+------------+------------|
| AAPL | 6 | 10-23-2015 |
| AAPL | 5 | 10-22-2015 |
| AAPL | 4 | 10-21-2015 |
| AXP | 5 | 10-23-2015 |
| AXP | 3 | 10-22-2015 |
| AXP | 5 | 10-21-2015 |
+------- +-------------+------------+
答案 0 :(得分:1)
最好的办法是使用带有聚合case语句的窗口函数,该语句用于在数据上创建一个数据透视。
您可以在此处查看有关窗口功能的更多信息:http://www.postgresql.org/docs/current/static/tutorial-window.html
以下是您可能需要前往回答您问题的伪代码版本(抱歉,由于没有postgres数据库设置,我无法验证它。)
Select
ticker,
SUM(CASE WHEN rank = 1 THEN price ELSE 0 END) today,
SUM(CASE WHEN rank = 2 THEN price ELSE 0 END) yesterday
FROM (
SELECT
ticker,
price,
date,
rank() OVER (PARTITION BY ticker ORDER BY date DESC) as rank
FROM your_table) p
WHERE rank in (1,2)
GROUP BY ticker.
编辑 - 使用' else'
更新了案例陈述答案 1 :(得分:1)
您可以这样做:
with ranking as (
select ticker, price, dt,
rank() over (partition by ticker order by dt desc) as rank
from stocks
)
select * from ranking where rank in (1,2);
示例:http://sqlfiddle.com/#!15/e45ea/3
您的示例的结果将如下所示:
| ticker | price | dt | rank |
|--------|-------|---------------------------|------|
| AAPL | 6 | October, 23 2015 00:00:00 | 1 |
| AAPL | 5 | October, 22 2015 00:00:00 | 2 |
| AXP | 5 | October, 23 2015 00:00:00 | 1 |
| AXP | 3 | October, 22 2015 00:00:00 | 2 |
如果您的表格很大并且存在性能问题,请使用where
将数据限制为持续30天左右。