0

我试图只获取资产的最新位置,我发现了这个,按照那个例子。我这样做了:

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

但是我在“ELSE”附近收到了一个错误sintax,这意味着错误在这里:

    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

先感谢您

4

2 回答 2

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
于 2013-04-08T06:34:51.473 回答
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
于 2013-04-08T01:56:25.883 回答