2013-04-08 128 views
0

我試圖只拿到資產的最近位置,我發現this,下面的例子。我這樣做:TSQL獲取最近的記錄

ALTER PROCEDURE [SISACT].[index_activo_ubicacion] 
      @ubicado BIT = 1 
AS 
BEGIN 
    IF @ubicado = 1 
     SELECT activo, 
       ubicacion 
     FROM 
     (SELECT activo, 
      ubicacion, 
      Fecha_Ubicacion, 
      row_number() OVER (partition BY activo 
          ORDER BY abs(datediff(dd, Fecha_Ubicacion, getdate()))) 
      FROM [SISACT].ACTIVO_UBICACION) 
    ELSE 
    SELECT Activo FROM [SISACT].ACTIVOS_FIJOS a 
    WHERE NOT EXISTS (
        SELECT Activo FROM [SISACT].ACTIVO_UBICACION u 
        WHERE a.Activo = u.Activo 
    ) 
END 

但是我卻越來越sintax近「ELSE」的錯誤,這意味着該錯誤是在這裏:

SELECT activo, 
      ubicacion 
    FROM 
    (SELECT activo, 
      ubicacion, 
      Fecha_Ubicacion, 
      row_number() OVER (partition BY activo 
          ORDER BY abs(datediff(dd, Fecha_Ubicacion, getdate()))) 
    FROM [SISACT].ACTIVO_UBICACION) 

,但我不知道我做錯了,因爲我對於TSQL來說相當新穎。誰能幫我?

在表ACTIVO_UBICACION中會有許多記錄具有相同的ACTIVO但不同的Fecha_Ubicacion,我想選擇所有的ACTIVO,但只選擇最近的日期。含義

Activo | Ubicacion | Fecha_Ubicacion 
------------------------------------ 
Activ | 1244  | 2012-04-02 15:42:33 
FixedA | 4556  | 2012-05-05 13:33:34 
Activ | 4553  | 2012-05-06 22:11:45 
FixedA | 2S01  | 2012-07-10 12:44:20 
Activ | 1114  | 2013-03-14 14:33:45 

這意味着它應該返回

Activo | Ubicacion | Fecha_Ubicacion 
------------------------------------ 
FixedA | 2S01  | 2012-07-10 12:44:20 
Activ | 1114  | 2013-03-14 14:33:45 

預先感謝您

+0

您是否嘗試運行兩個不同的SQL語句自己先驗證它們?我建議分而治之 - 將其中一個SQL語句改爲SELECT 1並保存SP。然後改變其他...然後刪除IF。 SP錯誤消息通常不會有幫助,您的代碼對我來說看起來很好。 – 2013-04-08 01:47:03

回答

2

語法錯誤與第一別名做SELECT的子選擇。

在Transact-SQL中,派生表必須有有別名。你的顯然沒有,儘管SQL Server「認爲」後續ELSE可能是一個。由於ELSE是保留關鍵字,因此解析器會報告錯誤。所以,解決方案是添加一個別名。

但是,row_number表達式沒有名稱,這將是解析器在修復派生表的別名後會抱怨的下一件事。下面是這兩個固定的,以及一個更多的建議作爲評論:

ALTER PROCEDURE [SISACT].[index_activo_ubicacion] 
      @ubicado BIT = 1 
AS 
BEGIN 
    IF @ubicado = 1 
     SELECT activo, 
       ubicacion 
     FROM 
     (SELECT activo, 
      ubicacion, 
      Fecha_Ubicacion, 
      row_number() OVER (
      partition BY activo 
      ORDER BY abs(datediff(dd, Fecha_Ubicacion, getdate())) 
     ) AS RowNum 
      FROM [SISACT].ACTIVO_UBICACION 
     ) someAlias 
     -- possibly you need this filter as well (uncomment it if so): 
     -- WHERE RowNum = 1 
    ELSE 
    SELECT Activo FROM [SISACT].ACTIVOS_FIJOS a 
    WHERE NOT EXISTS (
        SELECT Activo FROM [SISACT].ACTIVO_UBICACION u 
        WHERE a.Activo = u.Activo 
    ) 
END 
+0

你好。試過這個,但我得到了「沒有列名被指定爲'alias'的第4列 – Splendonia 2013-04-09 03:11:14

+0

@Splendonia:那麼,你有沒有試過爲它指定一個名字呢?這是沒有名字的'row_number()'表達式。我的更新 – 2013-04-09 05:06:56

+0

Uncommented the filter。It works。非常感謝您的回覆:) – Splendonia 2013-04-09 06:13:38

1

怎麼樣?:

select a.Activo, 
(select b.Ubicacion 
FROM ACTIVO_UBICACION b 
WHERE b.Fecha_Ubicacion=max(a.Fecha_Ubicacion)) as Ubicacion, 
max(a.Fecha_Ubicacion) as Fecha_Ubicacion 
from ACTIVO_UBICACION a 
GROUP BY a.Activo 
+0

忽略我以前的評論。它現在似乎在工作。 – 2013-04-08 02:37:37

+0

看看這個SQLFiddle(我的第一個):http://sqlfiddle.com/#!3/1f10d/1/0 – 2013-04-08 02:55:16

+0

這工作,非常感謝你:) – Splendonia 2013-04-09 03:21:42