sql server 中 使用lead() over()函数报错:lead无法识别的内置函数。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql server 中 使用lead() over()函数报错:lead无法识别的内置函数。相关的知识,希望对你有一定的参考价值。
sql server 中 使用lead() over()函数报错:lead无法识别的内置函数。但微软已公布可用。 lead的使用有版本限制吗?都有哪些版本可用改函数呢?
参考技术A LEAD(),OVER():ANSI SQL 2008 standard:关键是要ANSI的追问sql 已经实现了,但不是很好,每查询一行数据的时候,都需要重新扫表去找到下一行数据。
就类似于:A 表 有三个字段time,col1,col2。
select a.col1,
(select min(b.col2) from A b where b.time>a.time and b.col1=a.col1 ) new_col2 from A a ;
起初是想利用lead()函数完成new_col2的取值,该sql必须得保证A表中的数据不被过滤掉。有什么好的方法吗?
2.over函数可用,我使用从2005版本以后都可用,如果太旧的版本可能就不行。
C# 代码中的 SQL Lead 和 Lag 函数
【中文标题】C# 代码中的 SQL Lead 和 Lag 函数【英文标题】:SQL Lead and Lag functions from C# code 【发布时间】:2016-09-19 23:16:25 【问题描述】:是否可以在 C# 中使用 LEAD
或 LAG
SQL 函数?
我偏爱的方法是:
-
Linq to SQL
实体框架
动态 Linq
SQLFunctions 类
通过 SQLCommand 手动 TSQL
我知道可以通过方法 5 来完成,但是 1 到 4 呢?
【问题讨论】:
***.com/a/21767411/1132334 将暗示 1 和 3 是不可能的(还)。但是这个答案已经有两年多了,所以对最新的 .NET 框架的研究似乎值得付出努力 【参考方案1】:查看 MoreLinq 项目(在 github 上):http://morelinq.github.io
在那里,Lead 和 Lag 被实现为扩展:
public static IEnumerable<TResult> Lag<TSource, TResult>(
this IEnumerable<TSource> source,
int offset,
TSource defaultLagValue,
Func<TSource, TSource, TResult> resultSelector
)
参考:https://morelinq.github.io/2.0/ref/api/html/M_MoreLinq_MoreEnumerable_Lag__2_1.htm
编辑:这只是 Linq to Objects。因此,当应用于 SQL 数据源时,它将获取所有行,然后在数据库之外进行计算。这不是 OP 所期望的。
对于第 1、2、3 和 4 项,研究结果显示“否,这是不可能的”:
LEAD
和 LAG
出现在 SQL Server 2012 中,但最新版本的 Linq to SQL (Framework 4.6.1) 针对版本特定代码的 SQL Server 的最高版本是 2008:http://referencesource.microsoft.com/#System.Data.Linq/SqlClient/SqlProvider.cs,2fac3481a656764b
实体框架:不,抱歉。
MSDN 提示序列函数通常支持有限:https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-4.0/bb882656(v=vs.100)
没有暗示 SqlFunctions
会提供领先、滞后或类似的信息:https://docs.microsoft.com/en-us/dotnet/api/system.data.objects.sqlclient.sqlfunctions?&view=netframework-4.8
【讨论】:
我确实看过,但它似乎只是用于对象的 linq。我刚刚下载了最新的测试版来证明,是的,在执行内存中的滞后/领先之前从 SQL 中提取整个表。【参考方案2】:很棒的库 linq2db
https://github.com/linq2db/linq2db 支持 Window-Functions 和 LEAD
和 LAG
:
from p in db.Parent
join c in db.Child on p.ParentID equals c.ParentID
select new
Diff = Sql.Ext
.Lag(x.time, Sql.Nulls.None)
.Over()
.PartitionBy(p.time.Date)
.OrderBy(p.time)
.ToValue()
;
【讨论】:
以上是关于sql server 中 使用lead() over()函数报错:lead无法识别的内置函数。的主要内容,如果未能解决你的问题,请参考以下文章
在sqlserver 2008 怎么配置才可以正常支持lead和lag分析函数