仅返回列中具有特定值的第一行

时间:2015-05-22 03:25:19

标签: sql sql-server

我意识到这可能已被问过十亿次了,我可以发誓过去我已经做过这件事了,但今晚我已经脑筋胀落了或者无法理解它出...

我有一个数据库表(" t1"),我需要只能检索特定值出现在特定列中的第一行。

以下是数据样本:

 id  | qID | Name 
---------------------
  1  |  1  | Bob
  2  |  3  | Fred
  3  |  1  | George
  4  |  1  | Jack

我想要的结果是:

 id  | qID | Name
---------------------
  1  |  1  | Bob
  2  |  3  | Fred

我真正需要退出查询的唯一一列是第一列,但这不是需要删除重复项的地方,我认为不显示整行可能会让人感到困惑。< / p>

我尝试过使用它:

select id, qID, ROW_NUMBER() over(partition by qID order by qID) as zxy
from t1 where zxy = 1

但它给了我这个错误:

Msg 207, Level 16, State 1, Line 14
Invalid column name 'zxy'.

如果我删除查询的 where 部分,其余部分工作正常。我尝试了不同的变量名称,使用单引号或双引号围绕&#39; zxy&#39;但它似乎没有任何区别。并尽可能地尝试,我无法找到 SQL Server 文档的一部分,其中讨论了为表达式指定变量名称,如&#34; as zxy&#34;上述查询的一部分......如果有人有这样的链接,这非常有用。

毋庸置疑,除了&#34; zxy&#34;我还尝试过其他变量名称。但这没什么区别。

帮助!

2 个答案:

答案 0 :(得分:3)

WHERE子句在此过程中的应用早于SELECT。因此,zxy中无法使用计算列WHERE。为了实现您的目标,您需要将原始查询放在子查询或CTE中。

select id, qid
  from
(
  select id, qID, ROW_NUMBER() over(partition by qID order by qID) as zxy
    from t1 
) q  
 where zxy = 1

输出:

| id | qid |
|----|-----|
|  1 |   1 |
|  2 |   3 |

这是 SQLFiddle 演示

  

Logical Processing Order of the SELECT statement

     

1 FROM
  2 ON
  3加入
  4 WHERE
  5 GROUP BY
  6 WITH CUBE或WITH ROLLUP   7有   8选择
  9 DISTINCT
  10订购   11 TOP

答案 1 :(得分:0)

子句在选择子句之前执行,因此您无法在where cluase中找到ZXY

   with cte as
    (
    select id, qID, ROW_NUMBER() over(partition by qID order by qID) as zxy
    from t1 
    )
    select * from cte where zxy = 1

以下是我的博客,它可能对您有所帮助http://sqlearth.blogspot.in/2015/05/how-sql-select-statement-logically-works.html