2015-05-26 62 views
-1
FirstDate LastDate BaseCUR ConvertedCUR RATE  
20070501 20070531 USD........EUR.................1.369748 
20070601 20070615 USD........EUR.................1.354772 
20070616 20070702 USD........EUR.................1.354772 
20070703 20070727 USD........EUR.................1.343621 
20070728 20070731 USD........EUR.................1.343621 
20070801 20070831 USD........EUR.................1.376050 
20070901 20071002 USD........EUR.................1.369748 

這裏是我的數據庫的樣本重複的行,我的任務是以下行(S)與同'RATE''FirstDate''LastDate'合併成一行。合併在SQL表

我試圖用ROW_NUMBER()來對這些重複的'RATE'進行分組,但它也將那些不與別人相鄰的行分組,所以我不能合併所有這些行。

是否可以在不使用任何if-else或while循環的情況下實現此查詢?

結果必須是這樣的:

FirstDate LastDate BaseCUR ConvertedCUR RATE 
20070501 20070531 USD........EUR........1.369748 
20070601 20070702 USD........EUR........1.354772<<< the dates are merged 
20070703 20070731 USD........EUR........1.343621<<< the dates are merged 
20070801 20070831 USD........EUR........1.376050 
20070901 20071002 USD........EUR........1.369748 

任何解決方案或方向將不勝感激,謝謝提前。

+1

那麼,哪個rdbms? – Strawberry

+0

我正在使用Microsoft SQL Server – pandaDev

+0

嗯..,我無法理解您的MERGE規範。請詳細說明。 – tjeloep

回答

1

您可以使用下面的查詢:

SELECT MIN(FirstDate) AS FirstDate, MAX(LastDate) AS LastDate, 
     BaseCUR, ConvertedCUR, RATE 
FROM (
SELECT *, 
     ROW_NUMBER() OVER (ORDER BY FirstDate) - 
     RANK() OVER (PARTITION BY RATE ORDER BY FirstDate) AS rnk 
FROM mytable) t 
GROUP BY BaseCUR, ConvertedCUR, RATE, rnk 
ORDER BY FirstDate 

GROUP BY RATE, rnk標識連續RATE值的島嶼。使用MINMAX函數我們可以計算出每個島的起始和結束日期。

Demo here

+0

我認爲OP想要一個DML查詢。這讓我們中的2人誤解了不清楚的問題。 :) – tjeloep

+1

@tjeloep也許你有權利。我試着在我的答案中解決以下問題:*我試圖使用ROW_NUMBER()來對這些重複的「RATE」進行分組,但它也將那些不與其他人相鄰的行分組,所以我無法合併所有這些行* –

0

我會分兩步解決這個問題。下面是該方法的僞代碼我想借此:所有其他列

  1. 更新表,設置FirstDate = MIN(FirstDate)和LastDate = MAX(LastDate)和分組。

  2. 使用ROW_NUMBER消除所有重複的行。

0

我假設MERGE將獲得相同的RATE,BaseCUR和ConvertedCUR的最早的FirsDate和最新的LastDate。 如果是這樣的話:

SELECT MIN(FirstDate),MAX(LastDate),BaseCUR,ConvertedCUR,RATE FROM YourTable GROUP BY BaseCUR,ConvertedCUR,RATE;

P.S.請原諒這種格式,我在碼頭上使用移動版本。

+0

啊..,你想更新表。那麼請忽略我的答案。 ...或者,您可以將我的查詢插入到臨時表中,從原始表中刪除所有數據,並最終將數據從臨時表中插入到原始表中。祝你好運! – tjeloep