2012-12-05 56 views
2

如果某些觸發器解決方案已經覆蓋了這一點,但我無法讓它們適用於我的方案,但事先道歉。如何根據唯一密鑰增加SQL中的值

我有超過50,000行的表,所有這些行都有一個ID,其中有大約5000個不同的ID值。在表格等內可能有100行,instrumentID = 1和50與instrumentID = 2,但他們將有略有不同的列條目。所以,我可以寫一個

SELECT * from tbl WHERE instrumentID = 1 

,並使其返回100行(我知道這是簡單的東西,但僅僅是明確的)

我需要做的就是形成每一次儀器的遞增值ID被發現,所以我試過這樣的東西:

IntIndex INT IDENTITY(1,1), 
    dDateStart DATE, 
    IntInstrumentID INT, 
    IntIndex1 AS IntInstrumentID + IntIndex, 

在表創建步驟。

不過,我需要的時候找到一個instrumentIDIntIndex1遞增無論其中記錄在表中發現,使其有效地將提供的記錄數只是看着僅在過去IntIndex1值。而不是上面做什麼這是所有不論instrumentID的表中的行的增量,所以你會得到5001,4002,4003等

一個例子是:對intInstruments 5000和4000

intInstrumentID | IntIndex1 
--------- ------------------ 
    5000   | 5001 
    5000   | 5002 
    4000   | 4001 
    5000   | 5003 
    4000   | 4002 

我需要這樣做的原因是因爲我需要根據這些值加入兩個表格(每個instrumentID的開始日期和結束日期)。我已經嘗試GROUP BY等,但這不能在兩個表中工作和JOIN然後不起作用。

非常感謝

回答

1

我不能完全肯定我理解你的問題,但如果你只需要IntIndex1加入到,你可以只加入到下面的查詢,而不是試圖保持實際的計算值在數據庫:

SELECT *, 
     intInstrumentID + RANK() OVER(PARTITION BY intInstrumentID ORDER BY dDateStart ASC) AS IntIndex1 
FROM tbl 

編輯:如果我正確理解您的評論(!這不是一定的),那麼想必,你知道你的結束日期和開始日期表有相同的行數,從而導致它們之間的一對一映射是基於儀器ID內的各個結束日期?

如果是這樣的話,那麼也許這是一起你在找什麼:

SELECT SD.intInstrumentID, SD.dDateStart, ED.dEndDate 
FROM 
(
    SELECT intInstrumentID, 
      dStartDate, 
      RANK() OVER(PARTITION BY intInstrumentID ORDER BY dDateStart ASC) AS IntIndex1 
    FROM tblStartDate 
) SD 
JOIN 
(
    SELECT intInstrumentID, 
      dEndDate, 
      RANK() OVER(PARTITION BY intInstrumentID ORDER BY dEndDate ASC) AS IntIndex1 
    FROM tblStartDate 
) ED 
    ON SD.intInstrumentID = ED.intInstrumentID 
    AND SD.IntIndex1 = ED.IntIndex1 

如果沒有,請你會後的兩個表和預期結果的一些示例數據?

+0

這是一個很好的答案。如果你希望它成爲一個真正的列,只需添加一個新的空列並像這樣填充它。如果你的儀器ID是1000,2000,3000,那麼這很好。如果它們是1,2,3,1,2,那麼你就搞砸了,因爲你會變成11變成12。一個小小的添加,添加一個句點,並使您的列成爲小數。這樣,你得到1變成1.1和1.2而不是11和12. –

+0

感謝您的答案Fergus;我所擁有的是需要在遞增的instrumentID上連接在一起的2個表,並且對於每個開始日期,都有一個對應的結束日期(並且只有1個)。所以有一個「開始日期」表和一個「結束日期」表,每個表都應該按日期順序遞增,以便在JOIN後面的最終表中結束日期的結束日期。 RANK函數是有用的,但只返回1爲頂級,然後兩個等,而我需要它在分區內增加。另外,感謝您向我介紹OVER。 – user1878878

+0

謝謝弗格斯 - 你的回答幾乎和我今天寫的一樣,但我在CREATE表中寫了RANK OVER。這是因爲我想能夠驗證這兩個表中的隨機樣本。 – user1878878

相關問題