2

我正在尝试解释在 MSAccess 中构建的查询并将其转换为 SQL Server 的可用 SQL。

这是 SQL 视图中 Access 的语句:

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()andLast()函数在 SQL Server 中无效并且不起作用,所以我尝试使用MIN()andMAX()函数,因为该表没有增量 ID 字段或任何东西。一个大问题是,例如 appnum 在它的字段中可能有非常奇怪的数据,例如:

 MTP-021106

或者

HMTP-271103

因此,如果最后appnum插入的是HMTP-271103并且 genpol 表中有较早的条目,例如MTP-021106它们的 appnum

ThanMTP-021106将被返回,因为M大于H

此外,eff_date由于最新记录的日期可能比最后一个输入的日期更早,因此可能存在相同类型的问题。

Last(GENPOL.eff_date) AS LastOfeff_date,

CUSTFILE.CUSTNUM最终,查询为满足条件的每个返回一行HAVING

我认为可能的答案是使用该ROW_NUMBER()函数来获得我需要的结果,但无法让它与 GROUP BY 语句一起使用。

表 GENPOL:

(PK)appnum, varchar(13)
eff_date,日期时间
ntnum, varchar(15)

表 CUSTFILE:

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

样本数据

客户编号 | LastOfeff_date | FirstOfAppnum
MI99103 | 2013-01-01 | MTP-991103
MI99104 | 2013-01-01 | MTP-991104
MI99105 | 2013-01-01 | MTP-991105
4

1 回答 1

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 对表进行分区,然后按行号对其进行排序(First 为升序,Last 为降序)来获取每种情况的顶部记录。

由于连接的查询相当复杂,我也选择使用 a CROSS APPLY,因为它本质上是在进行连接之前过滤记录。

于 2013-04-29T19:57:08.340 回答