尝试显示具有最新日期的记录

时间:2014-05-09 10:47:49

标签: sql partition

我试图使用Over Partition创建一个基于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;

2 个答案:

答案 0 :(得分:2)

您没有使用您正在使用的RDBMS指定,但大多数只在执行查询后才应用别名。 一个技巧是将查询包装在另一个处理这种情况的查询中。 E.g:

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;

答案 1 :(得分:0)

使用MAX聚合

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