SQL Server 10.50 OVER PARTITION 无法识别

Posted

技术标签:

【中文标题】SQL Server 10.50 OVER PARTITION 无法识别【英文标题】:SQL Server 10.50 OVER PARTITION not recognized 【发布时间】:2019-09-24 23:32:25 【问题描述】:

我正在尝试在 SQL Server 2008 R2 (v10.50.1600.1) 中使用 OVER PARTITION,但编写和执行它表明 ORDER 附近出现错误,我尝试在 SQL Server 2014 中运行相同的查询而不进行修改( v12.0.4100.1),但它工作没有问题,并且在 SQL Server 文档中我没有设法找到任何东西,我知道还有其他方法可以模拟这个过程,但我想知道是否有更敏捷的等价。谢谢

SELECT 
    e.ID, e.[date], 
    COUNT(*) OVER (PARTITION BY e.ID ORDER BY e.[date] DESC) AS ind
FROM 
    events e 
JOIN 
    Manager h ON h.ID = e.ID AND h.Active = 1 AND h.[Status] <> 30037 
WHERE 
    e.Iary IN (1, 2, 3) 
GROUP BY 
    e.ID, e.[date]

我收到此错误:

消息 156,第 15 级,状态 1,第 3 行 关键字“ORDER”附近的语法不正确

【问题讨论】:

这些窗口函数是在 SQL Server 2012 (v11.x) 中引入的,在 SQL Server 2008 R2 (v10.50) 中不可用 .顺便提一下:SQL Server 2008 和 2008 R2 现在不再提供扩展支持 - red-gate.com/simple-talk/sql/database-administration/… - 升级时间! El COUNT() es para llevar una cuenta prograsiva de ese grupo, pero ya lo solucione, en 10.50 no es compatible usar el ORDER BY con un COUNT(), cosa que si funciona y cumple el objetivo en 12.0, cambiando el COUNT(*) por ROW_NUMBER() 【参考方案1】:

删除ORDER BY e.[date] DESC

SELECT e.ID, e.[date], COUNT(*) OVER(PARTITION BY e.ID) AS ind
FROM events e 
JOIN Manager h ON h.ID = e.ID AND h.Active = 1 AND h.[Status] <> 30037 
WHERE e.Iary IN (1,2,3) 
GROUP BY e.ID, e.[date]

【讨论】:

【参考方案2】:

您的查询应如下所示。您只想根据e.ID 获得count()

SELECT e.ID, e.[date], COUNT(*) AS ind
        FROM events e 
        JOIN Manager h ON h.ID = e.ID AND h.Active = 1 AND h.[Status] <> 30037 
        WHERE e.Iary IN (1,2,3) 
        GROUP BY e.ID, e.[date]
        ORDER BY e.[date]

【讨论】:

【参考方案3】:

COUNT() 是保留该组的一个程序帐户,但已经解决了,在 10.50 中使用带有 COUNT() 的 ORDER BY 是不兼容的,如果它工作并满足 12.0 中的目标,将 COUNT (* ) 更改为 ROW_NUMBER ()

SELECT e.ID, e.[date], ROW_NUMBER() OVER (PARTITION BY e.ID ORDER BY e.[date] DESC) AS ind FROM events e JOIN Manager h ON h.ID = e.ID AND h.Active = 1 AND h.[Status] <> 30037 WHERE e.Iary IN (1, 2, 3) GROUP BY e.ID, e.[date]

【讨论】:

SO 是一个只有英文的网站。 对不起,英语不是我的母语,回复时复制未翻译的文本

以上是关于SQL Server 10.50 OVER PARTITION 无法识别的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 的 OVER 子句中使用变量

sql server中的开窗函数over视图事物

SQL Server count() over() with distinct

sql server 中 使用lead() over()函数报错:lead无法识别的内置函数。

SQL Server:使用具有相同 OVER 子句的多个聚合/分析函数?

SQL Server 2012 - 开窗函数