2016-02-18 26 views
0

我有一個四列的表。當有重複的開始時間值時,我需要顯示具有最新(最新)插入值的行。在下面的示例中,前兩行具有相同的開始時間值。我想顯示插入值爲'2016-02-07 10:45:00'的行,因爲它具有重複行的更新(更新)日期和時間。我需要這整個表不只一行。先謝謝你。我很困難。基於第二個字段的SQL重複行

Table Image

+0

歡迎來到StackOverflow。通常最好將數據上的文本顯示在圖像上,並且最好顯示您迄今嘗試的查詢。 –

+0

使用[ROW_NUMBER](https://msdn.microsoft.com/zh-CN/library/ms186734.aspx) –

+0

哦。對於那個很抱歉。我以前只問過其他問題。我不必非常執行SQL,並且卡住了。如果有幫助,我可以找到我已經試過的東西並粘貼在這裏。 –

回答

2

使用ROW_NUMBER可能是最簡單的方法。

SELECT * 
FROM (SELECT *, 
       ROW_NUMBER() OVER (PARTITION BY DriverID,StartTime ORDER BY InsertTS DESC) RowNum 
     FROM MyTable 
     ) t 
WHERE RowNum = 1 

SQL Fiddle Demo

+0

這也會起作用,但我會好奇它將如何與自我加入選項進行比較。可能差不多相同 –

+0

我還沒有嘗試過你的具體例子。我會在一分鐘內。但是我嘗試了一些類似的東西,發生了什麼事情是我在重複不存在時丟失了這一行。就像那行不包括在內。 –

+0

將'Activity'添加到'PARTITION BY'子句。 –

0

你可以做這樣的事情:

SELECT DriverID 
     ,Activity 
     ,StartTime 
     ,MAX(InsertTS) as InsertTS 
     ,MAX(Duration) as Duration 
FROM TableName 
GROUP BY DriverID, Activity, StartTime 

這假設持續時間會比較長,當有重複。如果不是這種情況,您可以將其用作自加入:

SELECT t1.* 
FROM TableName t1 
INNER JOIN (
    SELECT DriverID 
      ,Activity 
      ,StartTime 
      ,MAX(InsertTS) as InsertTS 
    FROM TableName 
    GROUP BY DriverID, Activity, StartTime) t2 
ON t1.DriverID = t2.DriverID 
    AND t1.Activity = t2.Activity 
    AND t1.StartTime = t2.StartTime 
    AND t1.InsertTS = t2.InsertTS 
+0

我嘗試了第一個查詢,它看起來像是有效的。我的下一個問題是如果第一行的持續時間更長,那麼該怎麼辦(儘管它不應該是)。現在嘗試第二個查詢。 –

+0

在這種情況下,我可能會使用@ JamieD77的建議。但任何一個人都應該工作。 –

0

一個CTEWindowed functions可以讓這個更清潔。

WITH [Expanded] AS (
    SELECT 
     DriverID 
     ,Activity 
     ,StartTime 
     ,InsertTS 
     ,Duration 
     ,MAX(InsertTS) OVER (PARTITION BY DriverID, Activity, StartTime) as InsertTS_Max 
     ,MAX(Duration) OVER (PARTITION BY DriverID, Activity, StartTime) as Duration_Max 
    FROM TableName 
) 
    SELECT * 
    FROM [Expanded] 
    WHERE 
     InsertTS = InsertTS_Max 
+0

作爲一個註釋,如果你有多個記錄具有'R MAX_NUMBER()'過濾的'MAX'值,或者按照時間排序的主鍵做'MAX'。 –