2017-06-12 47 views
3

我需要爲每個不同的學生ID返回第一條記錄。在我的示例代碼中,我有一個記錄在同一天有兩個事件,另一個在不同日期有多個事件的學生。如何以最早的日期返回記錄?

我需要選擇最早的日期,如果不止一個發生在同一天,那麼最早的事件ID作爲下一個標準。什麼是這樣做的好方法?

我在這個數據集中有大約35列,但爲了簡潔起見只包括了下面的前5個。

數據:

Picture of data

期望的結果:

Picture of desired results

的代碼示例如下。

CREATE TABLE #TEMP (
    StudentID float, 
    SchoolID float, 
    StudentNameFull nvarchar(255), 
    IncidentID float, 
    IncidentDate date 
) 

    INSERT INTO #TEMP (StudentID, SchoolID, StudentNameFull, IncidentID, IncidentDate) 
    VALUES 
    (1111111, 406, 'Smith,John', 123321, '20170501'), 
    (1111111, 406, 'Smith,John', 123322, '20170501'), 
    (2222222, 406, 'Jones,Tim', 654789, '20170501'), 
    (2222222, 406, 'Jones,Tim', 659872, '20170503'), 
    (2222222, 406, 'Jones,Tim', 478978, '20170508') 

    SELECT * FROM #TEMP 

謝謝。

回答

6

在SQL Server中,可以使用ROW_NUMBER()做到這一點:

select t.* 
from (select t.*, 
      row_number() over (partition by StudentId order by IncidentDate, IncidentID) as seqnum 
     from #TEMP t 
    ) t 
where seqnum = 1; 

這解釋「最簡單的事件「爲」事件發生的最小值「。

+1

謝謝@Gordon Linoff,你的意思是「最早的事件」? – JM1

+1

我寧願用'DENSE_RANK'而不是'ROW_NUMBER'來做這些事情。如果存在平局,則ROW_NUMBER將只選擇一條記錄,而DENSE_RANK則選擇兩條(或更多)。即使在這樣的情況下,可能不會有聯繫,我想知道他們是否會發生。 – HoneyBadger

+0

謝謝@HoneyBadger,語法會相似嗎?只需用Dense_Rank替換Row_Number? – JM1

5

您可以使用在演唱會與領帶子句ROW_NUMBER()

SELECT Top 1 with Ties * 
    FROM #TEMP 
    Order By Row_Number() over (Partition By StudentID Order by IncidentDate,IncidentID) 
+0

你忘了訂購'IncidentId' ......仔細檢查數據。 –

+0

@TimBiegeleisen謝謝接力 –

+0

它是什麼樣的邏輯...... +1爲新的做法.. –

相關問題