【发布时间】:2016-09-08 22:43:54
【问题描述】:
我在 SQL Server 2012 中构建了一个表值函数,它返回表中每个唯一车辆在用户定义的日期和时间之前的最后一个已知位置:
CREATE FUNCTION [dbo].[LAST_AVL_LOC] (@dateIn datetime2(7))
RETURNS TABLE
AS
RETURN
WITH summary AS (
SELECT p.title,
p.local_Time,
p.vgroup,
p.speed,
p.heading,
p.latitude,
p.longitude,
p.shape,
ROW_NUMBER() OVER(PARTITION BY p.title ORDER BY p.local_Time desc) AS rk
FROM ac.AVL_POINTS p where p.local_Time < @dateIn)
SELECT s.*
FROM summary s
WHERE s.rk = 1
这段代码运行良好,可以在 SQL 中这样调用:
select * from [dbo].[LAST_AVL_LOC]('09/05/2016')
这将返回表格中每辆独特车辆的表格,其中包含 2016 年 9 月 5 日之前的最后已知位置和其他信息。
我的问题是此功能需要由 SQL 之外的 GIS 包使用,并且该软件唯一暴露和“可调用”的 SQL 结构是表和视图。我想将这个表值函数包装在一个视图中,以便可以以这样的方式调用它并仍然返回同一个表:
select * from VIEW_LAST_AVL_LOC where last_date = '09/05/2016'
这样的壮举可能吗?
【问题讨论】:
-
视图就是……视图。无法接收参数。
-
你能重写这个函数来做类似 GROUP BY p.local_Time 的事情吗?您正在使用按日期查询的位置,我认为这不会是巨大的结果集。另一个想法 - MSSQL2012 可以创建内存优化表,您可以将数据预加载到该表中
-
写一个几乎相同但没有
p.local_Time < @dateIn的视图,并使用select * from view where local_time < '09/05/2016'调用它
标签: sql sql-server