Sql Query在使用row_number时给出错误缺少操作符

时间:2015-07-05 04:58:32

标签: c# .net sql-server oledb

我试图根据三个不同的列找到唯一的行

以下是我撰写的查询,但收到错误

  

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

这是查询

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);

1 个答案:

答案 0 :(得分:0)

如果您要求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  

希望这有帮助。