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 时给出错误缺少运算符的主要内容,如果未能解决你的问题,请参考以下文章