2012-06-30 5 views
1

나는 작은 데이터베이스 거래 시스템을 만들고 있으며 해결 방법이 확실하지 않은 복제 문제가 있습니다. 기본적으로 나는 그 가격이 정해 졌던 날짜와 함께 가격이있는 테이블을 가지고 있으며, 또한 거래가 이루어진 시간에 대한 테이블을 가지고있다. 나는 무역 datetime에 근거한 정확한 가격을 얻고 싶다. 당신이 데이터를 볼뿐만 아니라 나는 보통이 웹 사이트에서 SQL 질문을 게시하지 않기 때문에 그냥 말을해야하는 경우T-SQL은 두 날짜 사이에 가격을 얻습니다.

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 

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 

보기는 세 가지 주요 테이블입니다.

설명 가격이 12시 20분로 설정하고, 가격이 가격이이 두 기간이다 80입니다 12시 40분에서 다음 100의 경우

. 그래서 제가 12시 30 분에 사면, 마지막 가격이기 때문에 100의 가격에 구입하고 있습니다. 또한 모든 데이터를 볼 수 있도록 뷰에서 조인을 수행하고 있습니다. 나는 그것을 지금 게시 할 것이다.

감사

+0

내 업데이트 된 게시물을 살펴보십시오. 데이터베이스 논리를 사용하여 뷰를 만들었지 만 중복 행이 생깁니다. –

+0

아무도 도와 줄 수 있습니까? –

답변

1

이전에 특정 무역 날짜로 최신 가격을 얻으려면 :

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) 

당신은 price_detailsexch_ticker/trade_date (내림차순)에 인덱스를 추가 할 수 있습니다.

+0

내가하고있는 일을 볼 수는 있지만 어떻게하면 내 관점에 적용 할 수 있습니까? –

+0

적절한 가격을 선택하고 'exch_ticker'및 'trade_date'를 'trade as t'에서 선택하는 추가 논리로 'JOIN'' price_details'로보기를 변경하십시오. 빨리. – HABO

+0

정말 바보 같은 느낌이 드는군요. 당신이 내게 모범을 보일 수 있겠습니까? 내가하고 싶은 것은보기를 사용하여 거래 날짜를 기준으로 정확한 가격을 보여 주기만하면됩니다. –

0

다음은 SQL Server 2005 이상 버전을 전제로합니다.

아이디어는 Tradeprice_details 누구의 배 해당 거래 '배보다 큰 가격 필터링에 참여하는 첫 번째 :

SELECT ... 
FROM dbo.Trade t 
    INNER JOIN dbo.price_details pr ON pr.exch_ticker = t.exch_ticker 

을 위의 당신에게 모든 거래는 모든 가격을 가지고 행 세트를 얻을 것이다 무역의 시간.

1)이 trade_prices CTE를 추가 두 개의 대체),

2 : 지금 바로 최신의 가격을 순위를 얻을 :에

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 

를보기에이를 통합하기 위해, 당신은 단지 필요합니다

3)는 WHERE 절에 trade_prices.rnk = 1 조건을 추가하는 trade_prices에 가입하여, Tradeprice_details에 합류했다.

물론 trader 테이블은 Trade 대신 trade_prices에 연결됩니다. 또한보기의 선택 목록에서 표 별칭 prttrade_prices에 할당하도록 선택한 테이블로 변경해야합니다.

+0

귀하의 가정은 정확합니다. 나는 당신의 솔루션을 보아서 그것이 더 유용하다는 것을 알게 될 것입니다. –