2014-04-04 39 views
1

我在Web表單中繼承了一個代碼庫,並且遇到了SQL查詢問題。選擇最高的ID其中serviceId多次出現

SELECT foretag.namn, foretag.epost, foretag.forlangEj, service_fakturering.* 
FROM foretag 
INNER JOIN service ON foretag.id = service.foretagsid 
INNER JOIN service_fakturering ON service.id = service_fakturering.service_id 
    WHERE service_fakturering.giltighets_datum <= DATEADD(D, 30, GETDATE()) 
    ORDER BY bestallnings_datum DESC, id DESC 

在表service_fakturering有具有相同service_id

多行,我需要選擇最後一個,最大的ID,在INNER JOIN service_fakturering ON service.id = service_fakturering.service_id

+0

是什麼service_fakturering的主鍵列? – sarin

+0

這是service_fakturering.id –

回答

2

使用ROW_NUMBER()功能,具有common table expression一起,這是可以做到這樣的:

WITH cte_service_fakturering AS 
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY service_id ORDER BY id DESC) RN 
    FROM service_fakturering 
) 
SELECT foretag.namn, foretag.epost, foretag.forlangEj, cte.* 
FROM foretag 
INNER JOIN service ON foretag.id = service.foretagsid 
INNER JOIN cte_service_fakturering cte ON service.id = cte.service_id AND cte.RN = 1 
    WHERE service_fakturering.giltighets_datum <= DATEADD(D, 30, GETDATE()) 
    ORDER BY bestallnings_datum DESC, id DESC 
+0

工作完美,謝謝 –

1

小組選擇意願組中使用您的service_fakturering行併爲您獲取maxId。這隨後被用於加入回到您的查詢,篩選只有那些你感興趣的行。

SELECT foretag.namn, foretag.epost, foretag.forlangEj, service_fakturering.* 
FROM foretag 
INNER JOIN service ON foretag.id = service.foretagsid 
INNER JOIN service_fakturering ON service.id = service_fakturering.service_id 
INNER JOIN (Select service_fakturering.service_id, Max(service_fakturering.id) as Id 
      FROM service_fakturering 
      GROUP BY service_fakturering.service_id) x 
      ON x.service_id = service_fakturering.service_id 
      AND x.Id = service_fakturering.Id 
WHERE service_fakturering.giltighets_datum <= DATEADD(D, 30, GETDATE()) 
ORDER BY bestallnings_datum DESC, id DESC 
1

嘗試...... 你可以使用ROW_NUMBER表示訂購了一組

WITH CTE 
AS (
    SELECT * 
     , ROW_NUMBER() OVER (
      PARTITION BY service_id ORDER BY ID DESC 
      ) ROWNUM 
    FROM service_fakturering 
    ) 
SELECT foretag.namn 
    , foretag.epost 
    , foretag.forlangEj 
    , service_fakturering.* 
FROM foretag 
INNER JOIN service 
    ON foretag.id = service.foretagsid 
INNER JOIN service_fakturering 
    ON service.id = service_fakturering.service_id 
     AND ROW_NUM = 1 
WHERE service_fakturering.giltighets_datum <= DATEADD(D, 30, GETDATE()) 
ORDER BY bestallnings_datum DESC 
    , id DESC 
相關問題