programing

SQL에서 두 개의 고유한 열이 있는 최신 날짜별로 행 선택

instargram 2023. 3. 23. 22:16
반응형

SQL에서 두 개의 고유한 열이 있는 최신 날짜별로 행 선택

다음 쿼리와 결과를 사용하여 ChargeId와 ChargeType이 고유한 최신 엔트리를 찾습니다.

select chargeId, chargeType, serviceMonth from invoice

    CHARGEID    CHARGETYPE  SERVICEMONTH
1   101         R           8/1/2008
2   161         N           2/1/2008
3   101         R           2/1/2008
4   101         R           3/1/2008
5   101         R           4/1/2008
6   101         R           5/1/2008
7   101         R           6/1/2008
8   101         R           7/1/2008

희망 사항:

    CHARGEID    CHARGETYPE  SERVICEMONTH
1   101         R           8/1/2008
2   161         N           2/1/2008

GROUP BY를 사용하여 유형 및 ID별로 항목을 그룹화할 수 있습니다.다음으로 MAX() Aggregate 함수를 사용하여 최신 서비스 달을 가져올 수 있습니다.아래는 ChargeId, ChargeType 및 MostRecentServiceMonth의 결과 세트를 반환합니다.

SELECT
  CHARGEID,
  CHARGETYPE,
  MAX(SERVICEMONTH) AS "MostRecentServiceMonth"
FROM INVOICE
GROUP BY CHARGEID, CHARGETYPE

따라서 이는 요청자가 요청한 것이 아니라 "SQL selecting rows by most recent date"에 대한 답변입니다.

http://wiki.lessthandot.com/index.php/Returning_The_Maximum_Value_For_A_Row에서 수정

SELECT t.chargeId, t.chargeType, t.serviceMonth FROM( 
    SELECT chargeId,MAX(serviceMonth) AS serviceMonth
    FROM invoice
    GROUP BY chargeId) x 
    JOIN invoice t ON x.chargeId =t.chargeId
    AND x.serviceMonth = t.serviceMonth
SELECT chargeId, chargeType, MAX(serviceMonth) AS serviceMonth 
FROM invoice
GROUP BY chargeId, chargeType

대부분의 개발자가 대용량 데이터에 미치는 영향을 고려하지 않고 인라인 쿼리를 사용하고 있는 것을 알 수 있습니다.

간단하게는, 다음의 방법으로 이것을 실현할 수 있습니다.

select a.chargeId, a.chargeType, a.serviceMonth 
from invoice a
left outer join invoice b
on a.chargeId=b.chargeId and a.serviceMonth <b.serviceMonth 
where b.chargeId is null
order by a.serviceMonth desc
select to.chargeid,t0.po,i.chargetype from invoice i
inner join
(select chargeid,max(servicemonth)po from invoice 
group by chargeid)t0
on i.chargeid=t0.chargeid

위의 쿼리는 개별 과금 ID의 문자 유형 조합이 다른 경우 작동합니다.이 심플한 쿼리가 퍼포먼스 시간을 최소화하는 데 도움이 되기를 바랍니다.

sqlfiddle에서의 데모:

  1. 클래식한 방법.
select 
    chargeid, 
    chargetype,
    SERVICEMONTH
from invoice t0
where t0.SERVICEMONTH = (
    select max(SERVICEMONTH) 
    from invoice t1 
    where t1.chargeid = t0.chargeid
    and t1.chargetype = t0.chargetype
);
  1. 창 기능 사용.
with w_o as (
    select
        chargeid, 
        chargetype,
        SERVICEMONTH,
        row_number() OVER (PARTITION BY chargeid, chargetype ORDER BY SERVICEMONTH DESC) rn
    from invoice
)
select
    chargeid, 
    chargetype,
    SERVICEMONTH
from w_o
where rn = 1;

두 가지 스타일을 모두 이해하고 사용할 수 있어서 좋습니다.

언급URL : https://stackoverflow.com/questions/189213/sql-selecting-rows-by-most-recent-date-with-two-unique-columns

반응형