SQL查询到select今天和前一天的价格

SQL query to select today and previous day's price

我有如下所示的历史股价数据。我想生成一个新的 table,每个行情代码各占一行,其中包含最近一天的价格和前一天的价格。最好的方法是什么?我的数据库是 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 |
+------- +-------------+------------+

最好的办法是使用带有聚合案例语句的 window 函数,该语句用于创建数据的数据透视表。

您可以在此处查看有关 window 函数的更多信息: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'

更新了 case 语句

你可以这样做:

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 |

如果您的 table 很大并且存在性能问题,请使用 where 将数据限制为持续 30 天左右。