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