programing

구별을 사용하여 표에서 고유 레코드를 하나만 선택하는 방법

javamemo 2023. 9. 27. 16:47
반응형

구별을 사용하여 표에서 고유 레코드를 하나만 선택하는 방법

나의 테이블은 같은 멤버를 가진 몇개의 기록을 가지고 있습니다.아이디. 저는 한 개의 레코드만 출력하고 싶습니다.

select DISTINCT(MemberID)  from AnnualFees;

그러면 결과가 올 것입니다.하지만 다른 컬럼 데이터도 보여주고 싶지만 이걸 할 때는

select DISTINCT(MemberID),StartingDate,ExpiryDate,Amount  from AnnualFees;

동일 회원을 포함한 모든 세부 사항ID 데이터도 표시됩니다.

누가 도와줄 수 있습니까?

각 구성원 ID에 대해 임의로 행을 원하는 경우에만 이를 수행할 수 있습니다.

select memberid, this, that, theother
from
(
select memberid, this, that, theother,
       row_number() over (partition by memberid order by this) rn
from   annualfees
)
where rn = 1;

멤버 ID당 특정 행(예: 가장 최근의 시작 날짜를 가진 행)을 원할 경우 다음으로 수정할 수 있습니다.

select memberid, this, that, theother
from
(
select memberid, this, that, theother,
       row_number() over (partition by memberid order by StartDate desc) rn
from   annualfees
)
where rn = 1;

이것이 당신이 필요로 하는 것인지는 모르겠지만, 당신은 별개의 것이 아니라 그룹별로 살펴볼 필요가 있을 수도 있습니다.

동일한 멤버 ID를 가진 여러 레코드가 있는 경우 다른 레코드에서 원하는 레코드를 식별하는 방법을 정확하게 지정해야 할 수도 있습니다.

각 구성원의 마지막 시작 날짜를 확인하는 방법:

SELECT memberid, max(startingdate)
FROM annualfees
GROUP BY memberid

하지만 이런 식으로 하나의 기록을 식별하고 다른 열도 표시해야 한다면, 이런 속임수를 써야 할 것 같습니다.

예를 들어 위의 SELECT를 조인과 함께 하위 쿼리하여 원하는 다른 열에 조인합니다.

SELECT subq.memid, subq.startdate, a.expirydate, a.amount
FROM (
  SELECT memberid AS memid, max(startingdate) AS startdate
  FROM annualfees
  GROUP BY memberid ) subq
INNER JOIN annualfees a ON a.memberid = subq.memid 
               AND a.startingdate = subq.startdate

처음부터 끝까지 데이터 테이블도 보여줍니다("SET VERIE ON"을 사용하여 o/p를 추적/그랩했습니다).

-- show all rows
select *
from annualfees
order by memberid, startingdate
MEMBERID               STARTINGDATE              EXPIRYDATE           AMOUNT               
---------------------- ------------------------- -------------------- -------------------- 
1                      02-DEC-09                 05-FEB-10            111                  
1                      25-JUN-10                 25-JUN-11            222                  
2                      25-APR-10                 25-JUN-13            333                  

3 rows selected

/
-- show one member`s data using max(startingdate) as selector.
SELECT memberid, max(startingdate)
    FROM annualfees
    GROUP BY memberid
MEMBERID               MAX(STARTINGDATE)         
---------------------- ------------------------- 
1                      25-JUN-10                 
2                      25-APR-10                 

2 rows selected

/ 
-- show above data joined with the other columns.
SELECT subq.memid, subq.startdate, a.expirydate, a.amount
    FROM (
      SELECT memberid AS memid, max(startingdate) AS startdate
      FROM annualfees
      GROUP BY memberid ) subq
    INNER JOIN annualfees a ON a.memberid = subq.memid AND a.startingdate = subq.startdate
MEMID                  STARTDATE                 EXPIRYDATE           AMOUNT               
---------------------- ------------------------- -------------------- -------------------- 
1                      25-JUN-10                 25-JUN-11            222                  
2                      25-APR-10                 25-JUN-13            333                  

2 rows selected

/

중복되는 Member가 있는 행을 선택해야 합니다.어떤 식으로든 반환할 ID.시작 날짜가 가장 큰 행을 가져옵니다.

SELECT MemberID,StartingDate,ExpiryDate,Amount 
FROM AnnualFees af
WHERE NOT EXISTS (
        SELECT * from AnnualFees af2 
        WHERE af2.MemberID = af.MemberID 
        AND af2.StartingDate > af.StartingDate)

DISTINCT Member를 선택ID, 시작 날짜, 만료 날짜, 연회비에서 금액

부제를 떼다

언급URL : https://stackoverflow.com/questions/3116982/how-to-select-only-one-unique-record-from-the-table-using-distinct

반응형