Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-SQL在两个日期之间获取价格_Sql_Tsql_Datetime_Duplicate Data - Fatal编程技术网

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您的假设是正确的。我也会看看你的解决方案,看看它是否更有用。你的假设是正确的。我也会看看你的解决方案,看看它是否更有用。