Sql 正在尝试显示具有最近日期的记录

Sql 正在尝试显示具有最近日期的记录,sql,partition,Sql,Partition,我试图使用Over分区根据SupplierAccountNumber创建一个行号,然后按DateTimeCreated排序,然后只显示记录1。我当前的脚本出现错误,显示无效的列名“RowNum” 我有一个有多个地址的供应商的电子邮件地址列表,我只想选择最近的电子邮件地址。有更好的方法吗 SELECT plsuppliercontact.plsuppliercontactid, plsupplieraccount.supplieraccountnumber, pls

我试图使用Over分区根据SupplierAccountNumber创建一个行号,然后按DateTimeCreated排序,然后只显示记录1。我当前的脚本出现错误,显示无效的列名“RowNum”

我有一个有多个地址的供应商的电子邮件地址列表,我只想选择最近的电子邮件地址。有更好的方法吗

SELECT plsuppliercontact.plsuppliercontactid, 
       plsupplieraccount.supplieraccountnumber, 
       plsupplieraccount.supplieraccountname, 
       plsupplieraccount.supplieraccountshortname, 
       plsuppliercontactvalue.contactvalue, 
       syscontacttype.name, 
       Rownum = Row_number() 
                  OVER( 
                    partition BY plsupplieraccount.supplieraccountnumber 
                    ORDER BY plsuppliercontactvalue.datetimecreated DESC) 
FROM   alops.dbo.plsupplieraccount PLSupplierAccount, 
       alops.dbo.plsuppliercontact PLSupplierContact, 
       alops.dbo.plsuppliercontactvalue PLSupplierContactValue, 
       alops.dbo.syscontacttype SYSContactType 
WHERE  plsupplieraccount.plsupplieraccountid = 
       plsuppliercontact.plsupplieraccountid 
       AND plsuppliercontactvalue.plsuppliercontactid = 
           plsuppliercontact.plsuppliercontactid 
       AND syscontacttype.syscontacttypeid = 
           plsuppliercontactvalue.syscontacttypeid 
       AND (( syscontacttype.name = 'E-mail Address' )) 
       AND rownum = 1;
使用最大聚合

SELECT plsuppliercontact.plsuppliercontactid, 
       plsupplieraccount.supplieraccountnumber, 
       plsupplieraccount.supplieraccountname, 
       plsupplieraccount.supplieraccountshortname, 
       plsuppliercontactvalue.contactvalue, 
       syscontacttype.name, 
       MAX(plsuppliercontactvalue.datetimecreated)
FROM   alops.dbo.plsupplieraccount PLSupplierAccount, 
       alops.dbo.plsuppliercontact PLSupplierContact, 
       alops.dbo.plsuppliercontactvalue PLSupplierContactValue, 
       alops.dbo.syscontacttype SYSContactType 
WHERE  plsupplieraccount.plsupplieraccountid = 
       plsuppliercontact.plsupplieraccountid 
   AND plsuppliercontactvalue.plsuppliercontactid = 
       plsuppliercontact.plsuppliercontactid 
   AND syscontacttype.syscontacttypeid = 
       plsuppliercontactvalue.syscontacttypeid 
   AND (( syscontacttype.name = 'E-mail Address' )) 
GROUP BY plsuppliercontact.plsuppliercontactid, 
         plsupplieraccount.supplieraccountnumber, 
         plsupplieraccount.supplieraccountname, 
         plsupplieraccount.supplieraccountshortname, 
         plsuppliercontactvalue.contactvalue, 
         syscontacttype.name

您没有指定正在使用的RDBMS,但大多数RDBMS只在执行查询后应用别名。 一个技巧是将查询包装到处理此条件的另一个查询中。例如:

SELECT *
FROM   (
    SELECT plsuppliercontact.plsuppliercontactid, 
           plsupplieraccount.supplieraccountnumber, 
           plsupplieraccount.supplieraccountname, 
           plsupplieraccount.supplieraccountshortname, 
           plsuppliercontactvalue.contactvalue, 
           syscontacttype.name, 
           Rownum = Row_number() 
                      OVER( 
                        partition BY plsupplieraccount.supplieraccountnumber 
                        ORDER BY plsuppliercontactvalue.datetimecreated DESC) 
    FROM   alops.dbo.plsupplieraccount PLSupplierAccount, 
           alops.dbo.plsuppliercontact PLSupplierContact, 
           alops.dbo.plsuppliercontactvalue PLSupplierContactValue, 
           alops.dbo.syscontacttype SYSContactType 
    WHERE  plsupplieraccount.plsupplieraccountid = 
           plsuppliercontact.plsupplieraccountid 
           AND plsuppliercontactvalue.plsuppliercontactid = 
               plsuppliercontact.plsuppliercontactid 
           AND syscontacttype.syscontacttypeid = 
               plsuppliercontactvalue.syscontacttypeid 
           AND (( syscontacttype.name = 'E-mail Address' ))
)
WHERE rownum = 1;

尝试删除“Rownum=”并在over by子句后添加“AS Rownum”,或者使用最大聚合。MAX(plsuppliercontactvalue.datetimecreated)@Bobby这两种方法都是有效的别名定义,无效的是在
其中
条件中为同一查询使用别名。对了,我从来不知道@Serpiton欢呼