카테고리 없음

[SQL] 고유 한 레코드를 선택하는 방법

행복을전해요 2021. 1. 23. 04:00

이 시도:

;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, MnameNID. 그러면 다음과 같이 보일 것입니다.

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