2013-04-29 58 views
2

我想解釋一個MSAccess中構建的查詢,並將它變爲SQL Server的可用SQL。ROW_NUMBER()和帶有扭曲的GROUP BY

下面是訪問SQL視圖中的語句:

SELECT CUSTFILE.CUSTNUM, 
Last(GENPOL.eff_date) AS LastOfeff_date, 
First(GENPOL.appnum) AS FirstOfAPPNUM 

FROM GENPOL INNER JOIN CUSTFILE ON GENPOL.entnum = CUSTFILE.ENTNUM 

GROUP BY CUSTFILE.CUSTNUM 

HAVING... 

ORDER BY LastGENPOL.eff_date DESC; 

正如我們所知道的First()Last()功能在SQL Server中的無效和不工作,所以我試圖用MIN()MAX()功能,因爲該表沒有增量ID字段或任何東西。一個大問題是,例如appnum可以有很奇怪的數據在它的領域,如:

MTP-021106 

OR

HMTP-271103 

因此,如果插入的最後appnumHMTP-271103和有更早的條目到genpol表像MTP-021106作爲他們的申請

將比MTP-021106將返回,因爲M大於H

此外,eff_date可能有相同的問題,因爲最新的記錄可能比最後一個輸入具有更早的日期。

Last(GENPOL.eff_date) AS LastOfeff_date, 

最終的查詢返回符合HAVING條件的每個CUSTFILE.CUSTNUM一行。

我相信可能是一個答案是使用ROW_NUMBER()函數來獲得我需要的結果,但一直無法使它與GROUP BY語句一起工作。

表GENPOL:

 
(PK)appnum, varchar(13) 
eff_date, datetime 
ntnum, varchar(15) 

表CUSTFILE:

 
(PK)CUSTNUM, varchar(8) 
ENTNUM, varchar(15) 

示例數據

 
CUSTNUM | LastOfeff_date | FirstOfAppnum 
MI99103 | 2013-01-01 | MTP-991103 
MI99104 | 2013-01-01 | MTP-991104 
MI99105 | 2013-01-01 | MTP-991105 
+2

如果您發佈了表結構,樣本數據和期望的結果,這將非常有幫助。 – Taryn 2013-04-29 17:33:28

+0

「ENTITY」應該被別名爲'CUSTFILE'嗎? – valverij 2013-04-29 18:40:23

+0

是,已編輯。 – Trelmoz 2013-04-29 18:51:44

回答

2

編輯:固定一個參考列中的一

基於你所列出的東西,這樣的事情應該工作:

SELECT 
    cfile.CUSTNUM, 
    aGENPOL.eff_date [LastOfeff_date], 
    bGENPOL.appnum [FirstOfAPPNUM] 
FROM CUSTFILE cfile 
CROSS APPLY (
    SELECT TOP 1 * 
    FROM (
     SELECT ROW_NUMBER() OVER(PARTITION BY entnum ORDER BY entnum) row, eff_date 
     FROM GENPOL 
     WHERE entnum = cfile.entnum   
    ) x 
    ORDER BY row DESC 
) aGENPOL 
CROSS APPLY (
    SELECT TOP 1 * 
    FROM (
     SELECT ROW_NUMBER() OVER(PARTITION BY entnum ORDER BY entnum) row, appnum 
     FROM GENPOL 
     WHERE entnum = cfile.entnum 
    ) y 
    ORDER BY row 
) bGENPOL 

基本上,在查詢申請將由每個entnum分區表搶每種情況的頂級記錄,然後按行號排序(首先升序,最後降序)。

由於加入的查詢相當複雜,我還選擇使用CROSS APPLY,因爲它本質上是在進行連接之前過濾記錄。

+0

完美!結果正是我所期待的。非常感謝您的幫助。 – Trelmoz 2013-04-29 20:44:38