2012-05-24 52 views
0

我有這樣的結果集片斷選擇頂n組,按時間

DateAndTime   Date  Hr Min Tag Val 
11/15/2011 0:00:29 11/15/2011 0 0 47 0.084000006318092 
11/15/2011 0:00:59 11/15/2011 0 0 47 0.086000002920628 
11/15/2011 0:00:13 11/15/2011 0 0 47 0.084000006318092 
11/15/2011 0:00:44 11/15/2011 0 0 47 0.087000004947186 
11/15/2011 0:05:06 11/15/2011 0 5 47 0.088500000536442 
11/15/2011 0:05:21 11/15/2011 0 5 47 0.084500007331371 
11/15/2011 0:05:51 11/15/2011 0 5 47 0.086000002920628 
11/15/2011 0:05:36 11/15/2011 0 5 47 0.088000006973743 
11/15/2011 0:10:41 11/15/2011 0 10 47 0.086000002920628 
11/15/2011 0:10:56 11/15/2011 0 10 47 0.089500002563000 
11/15/2011 0:10:09 11/15/2011 0 10 47 0.086500003933907 
11/15/2011 0:10:25 11/15/2011 0 10 47 0.089000001549721 
11/15/2011 0:15:45 11/15/2011 0 15 47 0.089000001549721 
11/15/2011 0:15:14 11/15/2011 0 15 47 0.087500005960465 
11/15/2011 0:15:29 11/15/2011 0 15 47 0.089500002563000 
11/15/2011 0:20:48 11/15/2011 0 20 47 0.106000006198883 
11/15/2011 0:20:03 11/15/2011 0 20 47 0.109500005841255 
11/15/2011 0:20:18 11/15/2011 0 20 47 0.104500003159046 
11/15/2011 0:20:33 11/15/2011 0 20 47 0.109000004827976 

我只想返回一行是分0,分5分10等等

+1

而你想選擇哪一行? – Lamak

+0

此鏈接是否有幫助? http://dba.stackexchange.com/a/18011/1186 –

+0

分鐘組的第一個或最後一個,每個分鐘組只需要1條記錄。 – Fonzy

回答

0

我認爲以下應在所有RDBMS(但是,我不能在此刻進行測試)工作:

SELECT actual.DateAndTime, actual.Tag, actual.Val 
FROM ResultTable actual 
LEFT JOIN ResultTable exclude 
ON exclude.Date = actual.Date 
AND exclude.Hr = actual.Hr 
AND exclude.Min = actual.Min 
AND exclude.DateAndTime > actual.DateAndTime 
WHERE exclude.DateAndTime IS NULL 

...這應該淨你的「最新」行per-分鐘。

+0

OMG!謝謝你x零!有效! – Fonzy

+0

我想,如果DataAndTime在Min列中找到相同的值,它將返回重複的行。在這種情況下,我提供的解決方案將起作用。 –

+0

@Romil - 是的,你是對的 - 如果DateAndTime不是唯一的,這將返回重複。希望如果這是一個時間戳,它將足以滿足OP的需求。你的解決方案_解決了這個問題(或者如果你在比較中包含了足夠多的列)。 –

0
DECLARE @Minutes VARCHAR(1000) 
;WITH MyRecords AS 
(
    SELECT TOP 3 Distinct Min FROM TableName 
) 


SELECT @Minutes = COALESCE(@Minutes + ', ', '') + MINFROM MyRecords 

PRINT @Minutes 

結果:0,5,10

如果您需要添加分鐘就可以@Minutes前輕鬆添加:)

+0

什麼?這不是OP想要的東西;他正在尋找_entire_行,每個不同的分鐘值(指定頂部或底部)。您的解決方案沒有幫助。 –

0
SELECT *, 
     id = IDENTITY(INT, 1, 1) 
INTO #temp 
FROM MyTable 
ORDER BY [min] 

SELECT o.* 
FROM #temp o 
WHERE o.id = (SELECT Min(id) 
       FROM #temp t 
       WHERE t.[Min] = o.[Min]) 
+0

它是SQL Server 2k row_number()over是用於Sql2k5及更高版本。感謝壽。 – Fonzy

+0

除非有特定的性能考慮,否則我會避免(明確)創建一個臨時表。此外(與您的說法相反),並非所有的RDBMS都會以這種方式支持「自動」臨時表(儘管我會在所有版本的SQL Server上對此進行推遲)。您還需要在比較中添加更多列,否則您將無法獲得完全正確的結果(例如,從2:00分5分,3:00分5分以及不同日期)。 OMG! –

0

這是你想要的窗口功能的情況,但他們無法在SQL Server 2000中

這裏是一個另類:

select t.* 
from t join 
    (select date, hour, min, min(datetime) as mindatetime 
     from t 
     group by date, hour, min 
    ) tsum 
    on t.datetime = tsum.mindatetime 

這假定日期時間字段是獨一無二的。否則,如果你在列中有一個id,你可以用它來代替。