SQL查询选择今天和前一天的价格

时间:2015-11-02 03:11:19

标签: sql postgresql lag

我有历史股票价格数据,如下所示。我想生成一个新表,每个自动收报机有一行,包含最近一天的价格和前一天的价格。最好的方法是什么?我的数据库是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 |
+------- +-------------+------------+

2 个答案:

答案 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天左右。