2

我已经查看了一些关于此的 SO 答案,但是由于我什至与业余 DBA 并不接近,所以他们有点过头了。谈论 cte 和一些我以前从未见过的内置函数。我想知道是否有一个更简单的解决方案来解决我想要找到的问题。这是我的查询:

SELECT DISTINCT systudent.lastname, 
                systudent.firstname, 
                ...
                systatchange.effectivedate AS StatusChangeDate 
FROM   systudent 
       INNER JOIN systatchange 
               ON systudent.systudentid = systatchange.systudentid 
       INNER JOIN syschoolstatus 
               ON systudent.syschoolstatusid = syschoolstatus.syschoolstatusid 
       INNER JOIN amleadsrc 
               ON systudent.amleadsrcid = amleadsrc.amleadsrcid 
       INNER JOIN amleadtype 
               ON systudent.amleadtypeid = amleadtype.amleadtypeid 
       INNER JOIN sycountry 
               ON systudent.sycountryid = sycountry.sycountryid 
       INNER JOIN adprogram 
               ON systudent.adprogramid = adprogram.adprogramid 
WHERE  systatchange.effectivedate >= Dateadd(day, -7, Getdate()) 
       AND systatchange.newsyschoolstatusid = 1 --Lead 
       AND syschoolstatus.descrip NOT IN ( 
           '56-Future Graduate', '92-Application Denied' ) 
       AND amleadtype.code <= 'HS2014' 
ORDER  BY leaddate DESC 

我正在收集有关在过去两周内状态更改为“1”(SyStatChange.NewSySchoolStatusID) 的人员的信息。

我遇到的问题是,对于某些用户,状态更改审计表显示重复记录。它们都有正确的状态更改字段,但生效日期是毫秒到几分钟,所以我被骗了。因此,对于用户 1 2 和 3,我只想要每个用户的最新记录。

仅获取最近日期更改的记录上的 SyStatChange 信息的最简单方法是什么?

4

1 回答 1

2

使用CTEROW_NUMBER()函数可能是最简单的方法。

WITH CTE AS 
(
    --note that you shouldn't use DISTINCT
    SELECT systudent.lastname, 
           systudent.firstname, 
           ...
           ROW_NUMBER() OVER (PARTITION BY systudent.systudentid 
                              ORDER BY systatchange.effectivedate DESC
                             ) as RN
           --Partition by on whatever is your unique/id column (or columns)
    FROM ... --your tables
    WHERE ... --your conditions
    --no order here
)
SELECT * FROM CTE
WHERE RN = 1
ORDER BY leaddate DESC 

PS:请尝试为您的表使用别名而不是全名。它将使您的查询更具可读性。

于 2013-10-08T13:51:51.777 回答