2013-10-08 20 views
1

我已經看過幾個關於這個問題的答案,但由於我並不真的接近業餘DBA,他們有點超過我的頭。談論cte和一些我以前從未見過的功能。我想知道是否有一個更簡單的解決方案,我試圖找到。這裏是我的查詢:我如何使這個查詢返回審計表(MSSQL 2008)的最新記錄

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信息?

回答

1

使用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:請嘗試使用您的表的別名而不是全名。它會讓你的查詢更具可讀性。

+0

老兄,謝謝!奇蹟般有效。我在我的列表中添加PARTITION和CTE以進行更多研究。另外,我來回擺弄桌子別名。對於這個特定的查詢,它是在一個巨大的第三方數據庫上,所以完整的表名可以幫助我跟蹤究竟在哪裏提取數據。在我創建和維護的數據庫上,我通常使用別名。再次感謝! – ledgeJumper

相關問題