我想解釋一個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
因此,如果插入的最後appnum
爲HMTP-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
如果您發佈了表結構,樣本數據和期望的結果,這將非常有幫助。 – Taryn 2013-04-29 17:33:28
「ENTITY」應該被別名爲'CUSTFILE'嗎? – valverij 2013-04-29 18:40:23
是,已編輯。 – Trelmoz 2013-04-29 18:51:44