source

표의 한 열만 기준으로 중복 값 제거

ittop 2023. 7. 16. 17:56
반응형

표의 한 열만 기준으로 중복 값 제거

내 질문:

SELECT sites.siteName, sites.siteIP, history.date
FROM sites INNER JOIN
     history ON sites.siteName = history.siteName
ORDER BY siteName,date

출력의 첫 번째 부분:

enter image description here

에서 중복 항목을 제거하려면 어떻게 해야 합니까?siteName칼럼?다음을 기준으로 업데이트된 것만 남기고 싶습니다.date기둥.

위의 출력 예에서 1, 3, 6, 10행이 필요합니다.

여기서 윈도우 기능이 작동합니다.row_number()유용합니다.

SELECT s.siteName, s.siteIP, h.date
FROM sites s INNER JOIN
     (select h.*, row_number() over (partition by siteName order by date desc) as seqnum
      from history h
     ) h
    ON s.siteName = h.siteName and seqnum = 1
ORDER BY s.siteName, h.date

당신의 예로 볼 때, 다음과 같이 가정하는 것이 타당해 보입니다.siteIP열은 다음에 의해 결정됩니다.siteName열(즉, 각 사이트에는 하나만 있음)siteIP) 만약 이것이 정말 그렇다면, 다음을 이용한 간단한 해결책이 있습니다.group by:

select
  sites.siteName,
  sites.siteIP,
  max(history.date)
from sites
inner join history on
  sites.siteName=history.siteName
group by
  sites.siteName,
  sites.siteIP
order by
  sites.siteName;

그러나 내 가정이 올바르지 않은 경우(즉, 사이트에 여러 개가 있을 수 있음)siteIP), 그렇다면 어떤 것이 당신에게 질문하는지 명확하지 않습니다.siteIP두 번째 열에 쿼리를 반환합니다.만약에siteIP그러면 다음 쿼리를 수행할 수 있습니다.

select
  sites.siteName,
  min(sites.siteIP),
  max(history.date)
from sites
inner join history on
  sites.siteName=history.siteName
group by
  sites.siteName
order by
  sites.siteName;

다음 패턴을 사용하여 이러한 쿼리를 해결합니다.

SELECT *
FROM t
WHERE t.field=(
  SELECT MAX(t.field) 
  FROM t AS t0 
  WHERE t.group_column1=t0.group_column1
    AND t.group_column2=t0.group_column2 ...)

즉, 필드 값이 최대값인 레코드를 선택합니다.이를 쿼리에 적용하기 위해 JOIN을 두 번 반복할 필요가 없도록 공통 테이블 식을 사용했습니다.

WITH site_history AS (
  SELECT sites.siteName, sites.siteIP, history.date
  FROM sites
  JOIN history USING (siteName)
)
SELECT *
FROM site_history h
WHERE date=(
  SELECT MAX(date) 
  FROM site_history h0 
  WHERE h.siteName=h0.siteName)
ORDER BY siteName

이 값은 최대 값을 계산하는 필드가 고유한 경우에만 작동합니다.예를 들어, 다음과(와)date필드는 각각 고유해야 합니다.siteName즉, IP를 밀리초당 여러 번 변경할 수 없는 경우입니다.제 경험에 따르면, 이것은 일반적으로 그렇습니다. 그렇지 않으면 어떤 레코드가 최신인지 알 수 없습니다.만약에history테이블에 대한 고유 인덱스가 있습니다.(site, date)이 쿼리는 또한 매우 빠릅니다, 인덱스 범위 스캔은history테이블 스캔은 첫 번째 항목만 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/17507887/eliminating-duplicate-values-based-on-only-one-column-of-the-table

반응형