1

次のテーブル Employee とレコードがあります。

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

個別の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

Ahhmこのクエリがどのように必要かわかりませんが、どういうわけか私はこれを期待される出力に基づいています

コード:

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 に答える