我试图只获取资产的最新位置,我发现this,遵循该示例。我这样做了:
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。含义
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 :(得分: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
答案 1 :(得分: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