2009-02-03 125 views
2

我在MS SQL表中有一組記錄。以日期爲主鍵。但是日期只適用於工作日,而不是持續的日子。例如:如何獲取SQL表中的下一條記錄

2000年1月3日12:00:00 AM 5209.540000000 5384.660000000 5209.540000000 5375.110000000 2000年1月4日12:00:00 AM 5533.980000000 5533.980000000 5376.430000000 5491.010000000 2000年1月5日12:00:00 AM 5265.090000000 5464.350000000 5184.480000000 5357.000000000 2000年1月6日12:00:00 AM 5424.210000000 5489.860000000 5391.330000000 5421.530000000 2000年1月7日12:00:00 AM 5358.280000000 5463.250000000 5330.580000000 5414.480000000 2000年1月10日12:00:00 AM 5617.590000000 5668.280000000 5459.970000000 5518.390000000 1/11/2000 12:00:00 AM 5513.040000000 5537.690000000 5221.280000000 5296.300000000 1/12/2000 12:00:00 AM 5267.850000000 5494.300000000 5267.850000000 5491.200000000

在此我試圖引入一個新的列到表中,它的值應該是第三層的值減去前一工作日的第三列的值。請幫我寫這樣的問題。我發現這很困難,因爲週末沒有日期。

回答

2

有幾種方法可以做到這一點。這是一個。

CREATE TABLE MyTable 
(
    MyDate datetime NOT NULL PRIMARY KEY, 
    Col2 decimal(14,4) NOT NULL, 
    Col3 decimal(14,4) NOT NULL, 
    Col4 decimal(14,4) NOT NULL, 
    Col5 decimal(14,4) NOT NULL 
) 
GO 

INSERT INTO MyTable 
SELECT '1/3/2000 12:00:00 AM', 5209.540000000, 5384.660000000, 5209.540000000, 5375.110000000 
UNION ALL 
SELECT '1/4/2000 12:00:00 AM', 5533.980000000, 5533.980000000, 5376.430000000, 5491.010000000 
UNION ALL 
SELECT '1/5/2000 12:00:00 AM', 5265.090000000, 5464.350000000, 5184.480000000, 5357.000000000 
UNION ALL 
SELECT '1/6/2000 12:00:00 AM', 5424.210000000, 5489.860000000, 5391.330000000, 5421.530000000 
UNION ALL 
SELECT '1/7/2000 12:00:00 AM', 5358.280000000, 5463.250000000, 5330.580000000, 5414.480000000 
UNION ALL 
SELECT '1/10/2000 12:00:00 AM', 5617.590000000, 5668.280000000, 5459.970000000, 5518.390000000 
UNION ALL 
SELECT '1/11/2000 12:00:00 AM', 5513.040000000, 5537.690000000, 5221.280000000, 5296.300000000 
UNION ALL 
SELECT '1/12/2000 12:00:00 AM', 5267.850000000, 5494.300000000, 5267.850000000, 5491.200000000 
GO 

CREATE VIEW MyView 
AS 
SELECT T1.*, 
    CalculatedColumn = Col3 - 
     (SELECT Col3 FROM MyTable Q2 
     WHERE Q2.MyDate = (SELECT MAX(Q1.MyDate) 
          FROM MyTable Q1 
          WHERE Q1.MyDate < T1.MyDate) 
    ) 
FROM MyTable T1 
GO 

SELECT * FROM MyView 
GO 

結果

MyDate     Col2  Col3  Col4  Col5  CalculatedColumn 
----------------------- --------- --------- --------- --------- ---------------- 
2000-01-03 00:00:00.000 5209.5400 5384.6600 5209.5400 5375.1100 NULL 
2000-01-04 00:00:00.000 5533.9800 5533.9800 5376.4300 5491.0100 149.3200 
2000-01-05 00:00:00.000 5265.0900 5464.3500 5184.4800 5357.0000 -69.6300 
2000-01-06 00:00:00.000 5424.2100 5489.8600 5391.3300 5421.5300 25.5100 
2000-01-07 00:00:00.000 5358.2800 5463.2500 5330.5800 5414.4800 -26.6100 
2000-01-10 00:00:00.000 5617.5900 5668.2800 5459.9700 5518.3900 205.0300 
2000-01-11 00:00:00.000 5513.0400 5537.6900 5221.2800 5296.3000 -130.5900 
2000-01-12 00:00:00.000 5267.8500 5494.3000 5267.8500 5491.2000 -43.3900 
+0

您可能可以優化內部的where子句以限制檢查Q1中的哪些行。你知道前面的行最多會在2到3天前。 – 2009-02-03 02:21:38

1

您需要將其分解爲2個部分。首先是更新現有數據,其次是確保所有新數據都具有正確的附加值。

對於第一部分,考慮使用CURSOR。它可能需要一段時間才能運行,但至少你只運行一次。像使用FOR循環一樣使用CURSOR;遍歷數據中的每一行,忽略第一行(因爲您沒有指定如何在沒有先前日期時計算新列的值)。很可能你應該按日期升序排序,以防萬一。

在迭代時,使用變量來存儲此行中的值。循環時,在獲取新行之前,將這些變量複製到以前的行版本中。例如,您有一個名爲'Col3'的變量,另一個名爲'lastCol3'。在循環到下一行之前(即光標移動到下一行),將col3的值複製到lastCol3中,然後獲得col3的新值。現在,您每行都有當前值和以前的值,並且可以調用「更新」來更新新列。

對於前進的新數據,您需要確保提供了新值,或者如果您希望SQL Server執行此操作,請使用選擇最近行col3的存儲過程,並使用該值計算插入表格之前的新值。

1

使用自聯接,並且採用內置的日期函數datepart(dw,@Date)優勢SQLServers的一個case語句。

我的確有責任注意到,首先做出這樣的轉變可能是一個壞主意。

相關問題