1

我有下表员工和记录如下:

Eid      Ename     Phone
------------------------     
 1         A        043
 1         A        067
 2         B        073
 2         B        072
 3         C        753 
 3         C        464

到目前为止我得到了什么:

SELECT *
FROM   (SELECT Row_number() OVER (ORDER BY Eid ASC) AS rownum,
               Eid,
               Ename,
               Phone
        FROM   Employee
        WHERE  Eid IN(SELECT DISTINCT(Eid)
                      FROM   Employee
                      GROUP  BY Eid)) AS RESULTSET
WHERE  rownum BETWEEN 0 AND 3

实际上,内部查询正在返回distinct结果,但是当我在 final 中得到结果时并没有反映出来RESULTSET

请告知如何获得不同的结果集。我的输出应该返回如下:

Eid      Ename     Phone
------------------------     
 1         A         043
 2         B         073
 3         C         753
4

5 回答 5

2

如果您使用该QUALIFY子句,您可以指定您希望返回的 Row_Number 值的范围。该QUALIFY子句适用于窗口聚合函数,就像该HAVING子句适用于非窗口聚合函数一样。

SELECT DISTINCT
       e1.eid
     , e1.ename
     , e1.ephone
--     , ROW_NUMBER() OVER(PARTITION BY e1.eid ORDER BY e1.eid) AS RowNum_
FROM emp e1
QUALIFY ROW_NUMBER() OVER(PARTITION BY e1.eid ORDER BY e1.eid) = 1

如果您包含RowNum_在结果集中,那么您可以再次在QUALIFY而不是ROW_NUMBER()窗口聚合中引用它。

于 2012-08-15T14:13:11.297 回答
2

您的查询要复杂得多。尝试通过使用来简化它CROSS APPLY

SELECT DISTINCT a.Eid, a.Ename, c.Phone
FROM   EMPLOYEE a
CROSS APPLY
(
  SELECT  TOP 1 ROW_NUMBER() OVER (PARTITION by Ename ORDER BY Eid ASC) AS RowNo,
          b.Eid, b.Phone
  FROM    EMPLOYEE b
  WHERE   a.EID = b.eid 
  ORDER BY RowNo ASC                         -- you can change this to DESC also
) c

我添加的原因DISTINCT是因为您正在加入表格。

另一个更简单的版本

SELECT DISTINCT a.Eid, a.Ename, c.Phone
FROM   EMPLOYEE a
CROSS APPLY
(
  SELECT  TOP 1 b.Eid, b.Phone
  FROM    EMPLOYEE b
  WHERE   a.EID = b.eid 
) c

SQLFiddle 演示

于 2012-08-16T03:09:53.567 回答
1

啊,我不确定你想要这个查询,但不知何故,我根据你的预期输出

代码:

select    Eid,Ename,Phone 
from      (select ROW_NUMBER() OVER (ORDER BY Eid ASC) AS rownum,
                  Eid,
                  Ename,
                  Phone 
           from Employee 
           where Eid in (select distinct(Eid) 
                         from Employee  )
         ) AS RESULTSET
Where rownum %2<>0

SQLFiddle 演示

于 2012-08-15T08:25:33.987 回答
0

试试这个

 SELECT * 
FROM   (SELECT Row_number() OVER (partition by ename ORDER BY Eid ASC) AS rownum, 
               Eid, 
               Ename, 
               Phone 
        FROM   Employeee
        WHERE  Eid IN(SELECT DISTINCT(Eid) 
                      FROM   Employeee
                      GROUP  BY Eid)) AS RESULTSET 
WHERE  rownum =1
于 2012-08-15T08:23:44.697 回答
0

试试这个:

 select Eid,Ename,Phone from 
 (select *,ROW_NUMBER() over(partition by Ename order by eid) as rn from emp) a
 where rn=1
于 2012-08-15T08:33:29.903 回答