0

나는 SERVICE_ID에 대한 MAX FROMDATE을 accountservice_id 반환하는 쿼리를 만들기 위해 노력하고 있습니다를 선택합니다. 각 SERVICE_ID여러가 묶여 년대를 accountservice_id 및 unfortunantly 맥스 항상 MAX FROMDATE이없는을 accountservice_id 수 있습니다. 예를 들어MAX 일 (여러 테이블)에 따라 행

:

service_id accountservice_id  fromdate 
--------------------------------------------------- 
3235   1081   2009-12-01 12:00:00 
3235   1007   2013-03-15 12:00:00 
3235   2104   2012-10-25 12:00:00 
3340   1047   2009-12-15 13:50:00 

아래는 내 현재 쿼리입니다.

SELECT service.service_id, accountservice.accountservice_id, accountservice.fromdate 
FROM service 
INNER JOIN accountservice ON service.service_id = accountservice.service_id 
WHERE (service.servicetype_id IN (1, 74571, 74566)) 
ORDER BY service.service_id, accountservice.fromdate 

답변

1

데이터를 가져 오기 위해 서브 쿼리를 수행 할 수 있습니다 . 하나의 쿼리를 사용하여 service_id에 대해 최대 fromdate를 얻은 다음 service_id 및 max fromdate와 일치하는 accountservice_id에 대한 검색에이 쿼리를 참여시킵니다.

SELECT maxfromdate.service_id, correct_account.accountservice_id, maxfromdate.maxfromdate 
FROM (SELECT 
    Service.service_id, 
    MAX (accountservice.fromdate) AS maxfromdate 
    FROM service 
    JOIN accountservice ON service.service_id = accountservice.service_id) 
    GROUP BY Service.service_id) maxfromdate 
JOIN (SELECT 
    Service.service_id, 
    accountservice.accountservice_id, 
    accountservice.fromdate 
    FROM service 
    JOIN accountservice ON service.service_id = accountservice.service_id 
)correct_account ON 
    (maxfromdate.service_id = correct_account.service_id 
     AND maxfromdate.maxfromdate = correct_account.fromdate) 
2

CTE + ROW_NUMBER()은 우승의 콤보입니다.

;with cte as (
    SELECT service_id, 
      accountservice_id, 
      max_date_rank = row_number() 
          over(partition by service_id 
           order by fromdate desc) 
    FROM service 
) 
SELECT * 
FROM cte 
WHERE max_date_rank = 1 

ETA : 파생 테이블 :

SELECT * 
FROM (
    SELECT service_id, 
      accountservice_id, 
      max_date_rank = row_number() 
          over(partition by service_id 
           order by fromdate desc) 
    FROM service 
) t 
WHERE t.max_date_rank = 1 
+0

이것은 내가 원하는 결과를 만들어 내고 있지만, 나는 cte에 익숙하지 않아 결과를 더 큰 쿼리에 통합하려고합니다. 파생 테이블 또는 쿼리의 다른 테이블에 조인 할 수있는 뭔가를 만들 수있는 방법이 있습니까? 감사. – Stedman

0

는 먼저 SERVICE_ID의 FROMDATE을 얻기 위해 임시 테이블을 만들 수 있습니다 후

Select service.service_id, max(accountService.fromdate) fromdate 
into #serviceMaxDate from service 
inner join accountService ON service.service_id = accountservice.service_id 
group by service.service_id 

, 단지 그것을 얻을 :

SELECT service.service_id, accountservice.accountservice_id, service.fromdate 
FROM #serviceMaxDate service 
INNER JOIN accountservice ON service.service_id = accountservice.service_id 
ORDER BY service.service_id, accountservice.fromdate 
관련 문제