簡體   English   中英

T-SQL獲取兩個日期之間的價格

[英]T-SQL get price between two dates

我正在制作一個小型數據庫交易系統,但我有一個重復問題,我不確定該如何解決。 基本上,我有一個帶有價格的表,其中包含設置該價格的日期時間,也有一個帶有交易時間的表。 我想根據交易日期時間獲得正確的價格。

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

視圖

USE [a_trading_system]
GO

/****** Object:  View [dbo].[V_all_uk]    Script Date: 06/30/2012 14:39:18 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER VIEW [dbo].[V_all_uk]
AS

SELECT distinct
co.exch_ticker,
--co.region_cd, 
po.portfolio_type, 
r.region_name, 
r.currency,
t.trade_id,
t.trade_volume,
t.trade_action,
t.trade_date,
pr.buy_price,

--(select distinct pr.buy_price from price_details pr
--where pr.price_set_date <= t.trade_date or  pr.price_set_date >= t.trade_date) as    price_details,

--MIN(t.trade_date) as trade_date,
--pr.buy_price,
--pr.sell_price,

--pr.price_set_date, --This is the cause of duplication
--pr.price_set_time,case when t.trade_date IS NOT NULL then 

--case 
--when t.trade_action = 'Buy' then 
--t.trade_volume * max(pr.buy_price)
--else
--case when trade_action = 'Sell' then
--t.trade_volume * max(pr.sell_price)
--end 
--end as 'trade_value' ,
tr.trader_name,
tr.trader_address, 
tr.phone
FROM dbo.Contract as co 
INNER JOIN dbo.Portfolio as po ON co.portfolio_id = po.portfolio_id 
INNER JOIN dbo.region as r ON co.region_cd = r.region_cd 
INNER JOIN dbo.Trade as t ON co.exch_ticker = t.exch_ticker 
INNER JOIN dbo.trader as tr ON t.trader_id = tr.trader_id
inner join dbo.price_details as pr on pr.exch_ticker = t.exch_ticker

where r.region_cd = 'UK'

--group by 

--co.exch_ticker,
--co.region_cd, 
--po.portfolio_type, 
--r.region_name, 
--r.currency,
--t.trade_id,
--t.trade_volume,
--t.trade_action,
--pr.buy_price,
--pr.sell_price,
--tr.trader_name,
--tr.trader_address, 
--tr.phone

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_date (desc)上的索引添加到price_details

以下假定使用SQL Server 2005或更高版本。

這個想法首先是加入Tradeprice_details過濾掉時間大於相應交易時間的價格:

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)添加trade_prices CTE,

2)替代兩個連接,以Tradeprice_details ,與加盟trade_prices

3)在WHERE子句中添加trade_prices.rnk = 1條件。

當然,現在trader表將被連接到trade_prices而不是Trade 您還需要將視圖選擇列表中的表別名prt更改為您選擇分配給trade_prices

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM