2014-03-05 24 views
0

編輯:意識到這些問題很多。嘗試一個子查詢並查看這些。只能檢查特定行的最大日期?

Edit2:只需要一個子查詢。現在工作。對於任何人的緣故別人在看這個,我加

where t2.startdate = (select max(startdate) from table2 as sub 
         where sub.item = t1.item) 
and t1.effectivedate = (select max(startdate) from table2 as sub2) 

我目前正在寫一個查詢拉從兩個單獨的表兩種速率,並返回這兩個利率之間的差額。我無法獲得適當的價格。我只需要獲取每個項目最近上市的費率。我的表中的數據是這樣的:

todate  item  rate 
2014-01-15 pencil  -0.07 
2014-01-17 pencil  -0.03 
2014-02-22 pencil  -0.05 
2014-01-15 pen  -0.013 
2014-01-17 pen  -0.02 
2014-02-22 pen  -0.032 

我希望它返回(假設這兩個表是完全一樣的):

Item   Rate1  Rate2   Difference  Date 
Pencil  -0.05  -0.05   0     2014-02-22 
Pen   -0.032  -0.032  0     2014-02-22 

兩個表都或多或少同樣的事情,只是以不同的價格。我的問題是我最終得到多個日期,無論我如何更改查詢。

我現在有這個權利:

use db 
select t1.item, t2.Rate as t2Rate, t1.Rate as t1Rate,(abs(t2.Rate) - abs(t1.Rate)) 
as Dffrnce, t2.startDate 

from table2 as t2 join table1 as t1 
on t2.item = t1.item 
where t2.StartDate = t1.EffectiveDate 
group by t1.item, t2.StartDate, t2.Rate, t1.Rate 
having t2.StartDate = max(t2.StartDate) 
order by t1.item 

我猜我的問題是制止從我不檢查每個項目的最高日專。但我不完全確定如何做到這一點。我嘗試使用不同的,但返回相同的結果。我錯過了明顯的東西嗎?我只想從最近的日期獲取利率。我試過加入的項目和最大日期,有聲明having max(t2.StartDate) = t1.effectivedate但似乎沒有工作。

回答

1

剛剛看到你的編輯,說你得到它的工作。尼斯。

您可能會考慮用不同的方法來確定要使用的行。

你在使用哪種SQL?並不是所有的東西都可以運作

DECLARE @Rate1 AS TABLE (id INT, rateDate DATE, rate INT) 
DECLARE @Rate2 AS TABLE (id INT, rateDate DATE, rate INT) 

INSERT INTO @Rate1 (id, rateDate, rate) VALUES (1, '2000-01-01', 1),(1, '2001-01-01', 3),(2, '2000-01-01', 4) 
INSERT INTO @Rate2 (id, rateDate, rate) VALUES (1, '2001-01-01', 2),(2, '2002-01-01', 3) 

;WITH r1 AS (SELECT *, ROW_NUMBER() OVER(PARTITION BY id ORDER BY rateDate DESC) rn FROM @Rate1) 
,  r2 AS (SELECT *, ROW_NUMBER() OVER(PARTITION BY id ORDER BY rateDate DESC) rn FROM @Rate2) 
SELECT * 
    FROM r1 
     INNER JOIN 
     r2 ON r1.id=r2.id 
WHERE r1.rn=1 
    AND r2.rn=1 
+0

我正在使用SQL Management Studio 2012.一旦我找到時間,我會看看這個。謝天謝地,這隻需要運行一次(據我所知)。感謝您的建議! – PointXIV