이 시도:
;with ff as
(
select ROW_NUMBER() OVER(PARTITION BY NID ORDER BY ID DESC) Num, *
FROM Table1
)
SELECT * FROM ff WHERE Num = 1
-------------------이 시도
;WITH CTE AS
(
SELECT
ROW_NUMBER() OVER ( PARTITION BY FName,MName,Name ORDER BY ID) AS rno,
FName,MName,Name,ID
FROM tableName
WHERE NID=10
)
SELECT * FROM CTE WHERE rno=1
을 NID=10
기반으로하는에 대한 고유 한 레코드를 반환합니다 FName,MName,Name
. 즉, 고유 한FName,MName,Name
시험
DECLARE @NID INT
SET @NID = 10;
WITH nidgroup
AS (SELECT id,
name,
fname,
mname,
nid
FROM people
WHERE nid = @NID)
SELECT *
FROM people
WHERE nid = @NID
AND name NOT IN (SELECT name
FROM nidgroup
GROUP BY name
HAVING Count(*) > 1)
AND fname NOT IN (SELECT fname
FROM nidgroup
GROUP BY fname
HAVING Count(*) > 1)
AND mname NOT IN (SELECT mname
FROM nidgroup
GROUP BY mname
HAVING Count(*) > 1)
참고 PARTITION 솔루션은 반환 할 고유 한 값이없는 경우 잘못된 결과를 반환합니다. 테이블에서 행 5를 제거해보십시오.
-------------------이는 단순히 "출력 목록에서 제외하는 이유"사양과 예제 출력을 기반으로합니다.
SELECT ID
Name ,
Fname ,
Mname ,
NID
FROM tableName
WHERE NID = 10
AND Name <> 'a'
AND FName <> 'y'
AND Mname <> 'gg'
"고유 한"레코드를 특별히 요청하는 이유를 잘 모르겠습니다. 예제 데이터를 사용하면 레코드를 추가 DISTINCT
하거나 제외 하더라도 1 개의 레코드 만 얻을 수 있기 때문입니다 .
주어진 기준에 일치 이상의 행이있을 것입니다 경우 제외 할 필요 ID
에 대한 고유 값을 얻기 위해 (그것이 기본 키 인 경우) 열 Name
, Fname
, Mname
와 NID
. 그러면 다음과 같이 보일 것입니다.
SELECT DISTINCT
Name ,
Fname ,
Mname ,
NID
FROM tableName
WHERE NID = 10
AND Name <> 'a'
AND FName <> 'y'
AND Mname <> 'gg'
다른 모든 답변은 지금까지 "출력 목록에서 제외하는 이유"에 지정된 기준을 무시하는 것 같습니다.
출처
https://stackoverflow.com/questions/22009867