Sql Query 在其中使用 row_number 时给出错误缺少运算符

Posted

技术标签:

【中文标题】Sql Query 在其中使用 row_number 时给出错误缺少运算符【英文标题】:Sql Query giving error missing operator while using row_number in it 【发布时间】:2015-09-22 12:06:12 【问题描述】:

我正在尝试根据三个不同的列查找唯一行

这是我编写的查询,但出现错误

查询表达式 'row_number() OVER (partition BY F1, F2,F3 order by F1) 中的语法错误(缺少运算符)

这里是查询

SELECT F1, F2, F3 
FROM
   (SELECT  
        *, 
        ROW_NUMBER() OVER (PARTITION BY F1, F2, F3 ORDER BY F1) AS rn 
    FROM 
        tblName) a 
WHERE rn = 1

有人可以弄清楚这个查询有什么问题吗?

我在 C# 程序中使用此查询来使用 oledb 从 Excel 工作表中提取数据。提前致谢。

这是我的 C# 代码

OleDbDataAdapter data = new OleDbDataAdapter(query, conn);
data.Fill(ds);

【问题讨论】:

如果您获取查询并直接在 SQL Server 数据库上运行它,您是否也会收到错误消息?如果没有,请发布您的 C# 代码。 如果你只是想找到唯一的值,你不能使用“select distinct F1, F2, F3”吗? 我在 Sql Server 数据库中没有收到错误 在 F1、F2、F3 上使用 ditinct 可能无法得到准确的结果,所以我需要使用 row_number 将数据从excel工作表导入sql server并在sql server中使用查询 【参考方案1】:

如果您要求 SQL Sevrer 获取具有 3 个不同值的行,那么尝试获取行号实际上没有任何意义。

假设两行 有相同的 3 个值......它应该返回什么行号?

您应该做的是使用RANK()(而不是行号)和PARTITION,并使用“WHERE RANK = 1”过滤器对其进行过滤。

这里有一个很好的例子: RANK

SELECT F1, F2, F3 
FROM
   (SELECT F1, F2, F3, RANK() OVER (PARTITION BY F1, F2, F3 ORDER BY F1) AS rn 
    FROM tblName) a 
WHERE rn = 1

但是,当您想要跨行查找“最近的某事或其他”时,RANK() 最有用,因为它们已按这 3 个不同的值分组。

如果您感兴趣的只是获取表中不同的 3 值组合的列表,您会发现只需执行 GROUP BY 会更简单:

SELECT F1, F2, F3  
FROM tblName
GROUP BY F1, F2, F3  

希望这会有所帮助。

【讨论】:

您的查询在尝试使用它从 Excel 工作表中提取数据时仍然出错。不过顺便谢谢。 group by 给出了我正在寻找的确切答案。

以上是关于Sql Query 在其中使用 row_number 时给出错误缺少运算符的主要内容,如果未能解决你的问题,请参考以下文章

sql over表示啥意思

over在SQL里就啥意思

SQL2012分页offset fetch 比较SQL2005/2008的ROW_Number

SQL基本操作——row_number() over()

在 sqlalchemy 中按 row_number 过滤

SQL+获取具有最新日期的行+row_number()+重复时的情况