[sql] 가장 최근 날짜로 행을 선택하는 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”에 대한 대답입니다.

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에 다른 청구 유형 조합이있는 경우 작동합니다.이 간단한 쿼리가 성능 시간을 고려할 때 도움이되기를 바랍니다.


답변