4

これが私のテーブル値です。(7レコード)

SELECT * FROM tbl1

担当者が少ないため、画像を投稿できません。だから私はここにリンクしています http://i.stack.imgur.com/CFl0u.png

最後のレコードを回避するためにクエリを作成しましたが、まだ最後のレコードを取得しています。(必要なのは個別のメールだけです)

SELECT DISTINCT CandEmail,CandName,EmployerId,ContNum,IsDeleted,CandPortalId FROM tbl1
WHERE EmployerId = 7 AND IsDeleted = 0

上記のクエリでも、最後に重複したメールレコードを持つ同じ7つのレコードが取得されます。

4

4 に答える 4

5

ROW_NUMBER次のOVER句で使用できます。

WITH CTE AS
(
  SELECT CandEmail,CandName,EmployerId,ContNum,IsDeleted,CandPortalId
        , RN = ROW_NUMBER() OVER (PARTITION BY CandEmail ORDER BY ContNum DESC)
  FROM tbl1
  WHERE IsDeleted = 0
)
SELECT CandEmail,CandName,EmployerId,ContNum,IsDeleted,CandPortalId
FROM CTE WHERE RN = 1

OVER句(Transact-SQL)

関連するウィンドウ関数が適用される前に、行セットの分割と順序を決定します。つまり、OVER句は、クエリ結果セット内のウィンドウまたはユーザー指定の行セットを定義します。次に、ウィンドウ関数はウィンドウ内の各行の値を計算します。

于 2012-10-12T21:58:53.387 に答える
2

使用group by:-

  SELECT CandEmail, MAX(CandName), MAX(EmployerId), MAX(ContNum), MAX(IsDeleted),          MAX(CandPortalId)
  FROM tbl1
  WHERE EmployerId = 7 AND IsDeleted = 0
  GROUP BY CandEmail
于 2012-10-12T21:57:38.333 に答える
1
SELECT CandEmail, 
       MAX(CandName), 
       7 [EmployerId], 
       MAX(ContNum), 
       0 [IsDeleted], 
       MAX(CandPortalId)
FROM   tbl1
WHERE  EmployerId = 7 AND IsDeleted = 0
GROUP BY CandEmail
于 2012-10-12T21:58:26.850 に答える
1

どちらを取得するかを気にしない場合はContNum、そのフィールドの周りに集計関数を配置してからGROUP BY、残りを配置できます。

SELECT CandEmail,
  CandName,
  EmployerId,
  MIN(ContNum) ContNum,  -- or you can use MAX()
  IsDeleted,
  CandPortalId 
FROM tbl1
WHERE EmployerId = 7 
  AND IsDeleted = 0
GROUP BY CandEmail,
  CandName,
  EmployerId, 
  IsDeleted,
  CandPortalId 

または、他の人が指摘しているように、これらの列に異なる値がないことが確実にわかっている場合を除き、他のフィールドでも集計関数を使用する必要があります。

SELECT CandEmail,
  min(CandName) CandName,
  min(EmployerId) EmployerId,
  MIN(ContNum) ContNum,  -- or you can use MAX()
  min(IsDeleted) IsDeleted,
  min(CandPortalId) CandPortalId
FROM tbl1
WHERE EmployerId = 7 
  AND IsDeleted = 0
GROUP BY CandEmail
于 2012-10-12T21:58:33.207 に答える