0

我试图创建一个返回accountservice_id与MAX 没有fromdate每个的service_id查询一行。每个service_id为可以有多个accountservice_id的把它捆起来,并unfortunantly的MAX accountservice_id并不总是有MAX 没有fromdate选择基于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的FROM日期:

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