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 天左右。
我有如下所示的历史股价数据。我想生成一个新的 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 天左右。