반응형
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에서의 데모:
- 클래식한 방법.
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
);
- 창 기능 사용.
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
반응형
'programing' 카테고리의 다른 글
"Bean Validation API가 클래스 경로에 있지만 구현을 찾을 수 없습니다"로 인해 부팅이 차단됩니다. (0) | 2023.03.28 |
---|---|
JSON - JSONArray를 통해 반복합니다. (0) | 2023.03.23 |
jq가 있는 배열에 요소가 있는지 확인하는 방법 (0) | 2023.03.23 |
Wordpress 사이트에서 데이터베이스 쿼리 통계를 표시하려면 어떻게 해야 합니까? (0) | 2023.03.23 |
MUI에서 TextField 글꼴 색상을 변경하시겠습니까? (0) | 2023.03.23 |