2013-08-22 128 views
0

我想寫一個查詢,以獲得與最新的日期,聯繫人姓名。 我有了不止一個結果爲每個聯繫人,但不同的日期表,我試圖讓該聯繫人的最新成果。只選擇行日期最新的

+0

看看這個問題:http://stackoverflow.com/questions/18362338/sql-server-max-function/18362443?noredirect=1#comment26986890_18362443 – JsonStatham

回答

0

試試這個:

SELECT * 
FROM contacts c1 
WHERE NOT EXISTS(
    SELECT 'NEXT' 
    FROM contacts c2 
    WHERE c1.fk_parent = c2.fk_parent 
    AND c2.date > c1.date) 

對於接下來的時間,添加表(與現場和關係)。

我的樣品是非常通用的,因爲我不知道你的結構

fk_parent,我認爲,是代表一個外鍵,其中,兩個不同的觸點鏈接(例如該字段可以是客戶現場場)

5

使用ranking functionROW_NUMBER()PARTITION BYORDER BY Date DESC

WITH CTE 
AS 
(
    SELECT *, 
    ROW_NUMBER() OVER(PARTITION BY contactId 
         ORDER BY date DESC) AS RN 
    FROM tablename 
) 
SELECT * 
FROM CTE 
WHERE RN = 1; 

這會給你只能爲每個聯繫人的最新日期的行。

0

而且,像...

select id, contactname from contacts c1 
where contactdate = (select max(contactdate) from contacts c2 where c2.id=c1.id) 
0

的下面創建一個每個觸點最大日臨時表。加入這個臨時表到你的基表會讓你找到你想要的結果。

 create table #latestContact (lastdate datetime ,contactid int); 
    insert into #latestContact (lastdate, contactid) 
    select max(createdate) 
    ,contactid 
    from ContactTable 
    group by contactid; 

    select * 
    from contactTable c 
    join #latestContact l 
    on l.lastdate = c.createdate 
    and l.contactid = c.contactid; 

我注意確保你的表結構是什麼樣子,但我相信你的聯繫表中有一個主鍵(接觸),並且還使用了創建日期時間字段(CREATEDATE)。

這可能比CTE排名上面,因爲它不會選擇不需要的行,然後篩選出來的最終結果集的例子更好。但是,我沒有看過查詢計劃或任何一個解決方案的統計 - 這將是看看有什麼效果最好的一個好辦法。

希望這會有所幫助。