T-SQL在两个日期之间获取价格
我正在制作一个小型的数据库交易系统,我有一个复制的问题,我不知道如何解决。基本上,我有一个表,上面有日期时间的价格,这个价格是设定的,我还有一个表,上面有交易的时间。我想根据交易日期时间得到正确的价格T-SQL在两个日期之间获取价格,sql,tsql,datetime,duplicate-data,Sql,Tsql,Datetime,Duplicate Data,我正在制作一个小型的数据库交易系统,我有一个复制的问题,我不知道如何解决。基本上,我有一个表,上面有日期时间的价格,这个价格是设定的,我还有一个表,上面有交易的时间。我想根据交易日期时间得到正确的价格 USE [a_trading_system] GO /****** Object: Table [dbo].[Trade] Script Date: 06/30/2012 14:49:44 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFI
USE [a_trading_system]
GO
/****** Object: Table [dbo].[Trade] Script Date: 06/30/2012 14:49:44 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Trade](
[trade_id] [uniqueidentifier] ROWGUIDCOL NOT NULL,
[trade_volume] [int] NOT NULL,
[trade_action] [varchar](5) NOT NULL,
[trade_date] [datetime] NOT NULL,
[timestap] [timestamp] NOT NULL,
[trader_id] [int] NOT NULL,
[exch_ticker] [varchar](8) NOT NULL,
CONSTRAINT [PK_Trades] PRIMARY KEY CLUSTERED
(
[trade_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[Trade] WITH CHECK ADD CONSTRAINT [FK_Trade_Contract] FOREIGN KEY([exch_ticker])
REFERENCES [dbo].[Contract] ([exch_ticker])
GO
ALTER TABLE [dbo].[Trade] CHECK CONSTRAINT [FK_Trade_Contract]
GO
ALTER TABLE [dbo].[Trade] WITH CHECK ADD CONSTRAINT [FK_Trade_Trader] FOREIGN KEY([trader_id])
REFERENCES [dbo].[Trader] ([trader_id])
GO
ALTER TABLE [dbo].[Trade] CHECK CONSTRAINT [FK_Trade_Trader]
GO
ALTER TABLE [dbo].[Trade] ADD CONSTRAINT [DF_Trades_trade_id] DEFAULT (newid()) FOR [trade_id]
GO
USE [a_trading_system]
GO
/****** Object: Table [dbo].[Contract] Script Date: 06/30/2012 14:56:19 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Contract](
[exch_ticker] [varchar](8) NOT NULL,
[exch_name] [varchar](50) NULL,
[portfolio_id] [varchar](8) NOT NULL,
[region_cd] [varchar](5) NULL,
CONSTRAINT [PK_Contract] PRIMARY KEY CLUSTERED
(
[exch_ticker] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[Contract] WITH CHECK ADD CONSTRAINT [FK_Contract_portfolio] FOREIGN KEY([portfolio_id])
REFERENCES [dbo].[portfolio] ([portfolio_id])
GO
ALTER TABLE [dbo].[Contract] CHECK CONSTRAINT [FK_Contract_portfolio]
GO
ALTER TABLE [dbo].[Contract] WITH CHECK ADD CONSTRAINT [FK_Contract_region] FOREIGN KEY([region_cd])
REFERENCES [dbo].[Region] ([region_cd])
GO
ALTER TABLE [dbo].[Contract] CHECK CONSTRAINT [FK_Contract_region]
GO
USE [a_trading_system]
GO
/****** Object: Table [dbo].[price_details] Script Date: 06/30/2012 14:58:37 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[price_details](
[price_id] [int] IDENTITY(1,1) NOT NULL,
[exch_ticker] [varchar](8) NOT NULL,
[price_set_date] [datetime] NOT NULL,
[buy_price] [decimal](7, 2) NOT NULL,
[sell_price] [decimal](7, 2) NOT NULL,
CONSTRAINT [PK_price_detail] PRIMARY KEY CLUSTERED
(
[price_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[price_details] WITH CHECK ADD CONSTRAINT [FK_price_details_Contract] FOREIGN KEY([exch_ticker])
REFERENCES [dbo].[Contract] ([exch_ticker])
GO
ALTER TABLE [dbo].[price_details] CHECK CONSTRAINT [FK_price_details_Contract]
GO
看法
如果您还需要查看数据,请使用以下三个主表,因为我通常不会在这个网站上发布SQL问题
解释
如果价格设定为12:20,价格为100,那么12:40的价格为80。这是两个日期范围。因此,如果我在12:30购买,那么我以100的价格购买,因为这是最后的价格。我还在视图中进行连接,以便可以查看所有数据。我现在就发
感谢您在特定交易日期前获得最新价格:
select buy_price, sell_price
from price_details
where exch_ticker = @exch_ticker and price_set_date =
( select max( price_set_date )
from price_details
where exch_ticker = @exch_ticker and price_set_date <= @trade_date )
您可能需要在exch_ticker/trade_datedesc上添加一个索引以获取价格详细信息。要获取特定交易日期之前的最新价格,请执行以下操作:
select buy_price, sell_price
from price_details
where exch_ticker = @exch_ticker and price_set_date =
( select max( price_set_date )
from price_details
where exch_ticker = @exch_ticker and price_set_date <= @trade_date )
您可能需要在exch_ticker/trade_datedesc上添加一个索引以显示价格详细信息。以下假定为SQL Server 2005或更高版本 这个想法是首先加入交易和价格详细信息,过滤出时间大于相应交易时间的价格:
SELECT ...
FROM dbo.Trade t
INNER JOIN dbo.price_details pr ON pr.exch_ticker = t.exch_ticker
以上内容将为您提供一个行集合,其中每笔交易都有截至交易时间的所有价格。现在只需对价格进行排名,即可获得最新价格:
WITH trade_prices AS (
SELECT
t.*, -- actually you might want to review the list
pr.price_set_date, -- of columns being pulled from the two tables
pr.buy_price,
pr.sell_price,
rnk = ROW_NUMBER() OVER (PARTITION BY t.trade_id ORDER BY pr.price_set_date DESC)
FROM dbo.Trade t
INNER JOIN dbo.price_details pr ON pr.exch_ticker = t.exch_ticker
)
SELECT *
FROM trade_prices
WHERE rnk = 1
要将其纳入您的视图,您只需:
1加上贸易价格CTE
2将两个连接(交易和定价)替换为一个连接到交易价格
3在WHERE子句中添加trade_prices.rnk=1条件
当然,trader表现在将被加入到交易价格中,而不是进行交易。您还需要将视图选择列表中的表别名pr和t更改为您选择分配给交易价格的别名。以下假定为SQL Server 2005或更高版本 这个想法是首先加入交易和价格详细信息,过滤出时间大于相应交易时间的价格:
SELECT ...
FROM dbo.Trade t
INNER JOIN dbo.price_details pr ON pr.exch_ticker = t.exch_ticker
以上内容将为您提供一个行集合,其中每笔交易都有截至交易时间的所有价格。现在只需对价格进行排名,即可获得最新价格:
WITH trade_prices AS (
SELECT
t.*, -- actually you might want to review the list
pr.price_set_date, -- of columns being pulled from the two tables
pr.buy_price,
pr.sell_price,
rnk = ROW_NUMBER() OVER (PARTITION BY t.trade_id ORDER BY pr.price_set_date DESC)
FROM dbo.Trade t
INNER JOIN dbo.price_details pr ON pr.exch_ticker = t.exch_ticker
)
SELECT *
FROM trade_prices
WHERE rnk = 1
要将其纳入您的视图,您只需:
1加上贸易价格CTE
2将两个连接(交易和定价)替换为一个连接到交易价格
3在WHERE子句中添加trade_prices.rnk=1条件
当然,trader表现在将被加入到交易价格中,而不是进行交易。您还需要将视图选择列表中的表别名pr和t更改为您选择分配给交易价格的别名。查看我更新的帖子。我已经用我的数据库逻辑创建了一个视图,但是我得到了重复的行。我已使用数据库逻辑创建了一个视图,但我得到了重复的行。我可以看到您在做什么,但我如何将其应用于我的视图?将视图更改为将价格详细信息与附加逻辑连接起来,以选择适当的价格,并从交易中提取exch_股票代码和交易日期作为t。快点,我现在觉得自己很笨,你能给我举个例子吗?我只想使用视图显示基于交易日期的正确价格。我在where子句中这样做:where r.region\u cd='UK'和t.exch\u ticker=pr.exch\u ticker和price\u set\u date=从price\u details中选择MAXprice\u set\u date,其中price\u set\u date内部连接dbo.price\u details作为pr.exch\u ticker=t.exch\u ticker和pr.price_set_date=从price_details中选择max price_set_date,其中exch_ticker=t.exch_ticker和price_set_date我可以看到你在做什么,但我如何将其应用到我的视图中?更改视图,将price_details与额外的逻辑连接起来,以选择适当的价格,并从trade中选择exch_ticker和trade_date作为t。快点,我现在觉得自己很笨,你能给我举个例子吗?我只想使用视图显示基于交易日期的正确价格。我在where子句中这样做:where r.region\u cd='UK'和t.exch\u ticker=pr.exch\u ticker和price\u set\u date=从price\u details中选择MAXprice\u set\u date,其中price\u set\u date内部连接dbo.price\u details作为pr.exch\u ticker=t.exch\u ticker和pr.price\u set\u date=从price\u details中选择max price\u set\u date,其中exch\u ticker=t.exch\u ticker和price\u set\u date您的假设是正确的。我也会看看你的解决方案,看看它是否更有用。你的假设是正确的。我也会看看你的解决方案,看看它是否更有用。