2013-03-14 54 views
0

我有一個數據庫有兩個表。一個Call_Info表,其中包含有關傳入/傳出呼叫的詳細信息,並具有一個名爲Call_ID的唯一ID。我有第二個表,它被鏈接並被稱爲After_Call_Work表。SQL檢索第一個匹配行

每次通話只會有一個通話記錄。數據集有點搞砸了,對於同樣的調用,在調用工作記錄後偶爾會有3或4個。我怎樣才能在做查詢時只檢索那個特定的呼叫的最早的呼叫後工作記錄而忽略其他呼叫呢?我想象使用SQL函數First_Value,但它似乎不是正確的。

使用Microsoft SQL Server 2012

任何想法?

+0

通常,當你有一個要求,如'每次調用將只有一個呼叫工作Record'後有CALL_INFO和AFTER_CALL_WORK之間的1對1的關係: ALTER TABLE AFTER_CALL_WORK 添加約束FK_AFTER_CALL_WORK_CALL_INFO 外鍵( AFTER_CALL_WORK.ID)引用CALL_INFO(CALL_ID);但是,正如你所指出的那樣,這個限制並沒有生效,並且存在着一對多的關係。 '最早'召喚工作行將由反映其創建日期的召喚工作之後的某個日期或日期時間欄確定。有這樣的專欄嗎? – Tim 2013-03-14 11:33:16

+0

@Tim對不起,我還沒有回覆您。在二次調用工作開始後的二次調用工作表中有一個starttime列,並且保持在從1970年開始的秒數內。它必須在調用結束之後,儘管可以在call_info表中找到它。仍然堅持這 – 2013-03-18 22:39:50

+0

你應該投票給我們的答案。 – 2013-03-25 16:05:17

回答

0

這可以通過利用Window Function

WITH call_List 
AS 
(
    SELECT Call_ID, OtherColumns, DateColumn, 
      ROW_NUMBER() OVER (PARTITION BY Call_ID ORDER BY DateColumn ASC) rn 
    FROM After_Call_Work 
) 
SELECT a.*, b.OtherColumns, b.DateColumn 
FROM Call_Info a 
     INNER JOIN call_List b 
      ON a.Call_ID = b.Call_ID 
WHERE b.rn = 1 
+0

什麼是「窗口函數」? – 2013-03-14 11:47:49

+0

@AshBurlaczenko一堆窗口函數可以在這裏找到[pgSQL窗口函數](http://www.postgresql.org/docs/9.2/static/tutorial-window.html)和[** here **](http ://msdn.microsoft.com/en-us/library/ms189461.aspx) – 2013-03-14 11:50:42

0

優勢來實現你應該能夠使用select top,像這樣:

SELECT TOP 1 
FROM call_info ci JOIN after_call_work acw ON ci.call_id=acw.call_id 
ORDER BY acw.work_time DESC 
WHERE ci.call_id=<your_call_id> 
+0

請注意,如果您正在查詢某個特定呼叫ID,則此命令有效。如果您需要跨多個呼叫進行查詢並獲取每個呼叫的第一個匹配項,請使用JW。的解決方案。 – 2013-03-14 11:30:31

0
WITH g AS (SELECT ROW_NUMBER() OVER (PARTITION BY callid 
ORDER BY date ASC) AS row,* from after_call_work 
select * from call_info cinfo inner join g on 
cinfo.callid = g.callid and g.row=1