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表中的数据不被过滤掉。有什么好的方法吗?

本回答被提问者采纳
参考技术B 1.可能我技术并不深入吧,使用sqlserver多年也没有发现有lead函数。
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# 中使用 LEADLAG 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 项,研究结果显示“,这是不可能的”:

LEADLAG 出现在 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 和 LEADLAG

    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无法识别的内置函数。的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER LEAD和LAG使用

在sqlserver 2008 怎么配置才可以正常支持lead和lag分析函数

sql SQL Server 2012 TSQL新函数LAG,LEAD,FIRST_VALUE和LAST_VALUE

SQL - LEAD() 函数

在SQL Server 2008中领先

SQL Server 2008 中用户定义的排名/分析函数