2017-01-18 124 views
1

我正在使用SQL Server 2014和Management Studio。讓我試着解釋我在做什麼。通過SQL查詢獲取多個分組的最新記錄

我有一個表,該表類似於下面的(非常簡化的)

enter image description here

我想創建一個查詢它會抓住每個參數的最新記錄,如果井全球ID是相同。我想看起來像以下內容:

enter image description here

與我不是一個偉大的SQL騎師我想一點點幫助。

我能找到最接近的事是那麼它只是搶到最新的記錄,如果全球ID匹配不考慮參數字段如下:

SELECT TOP 1000 
    [OBJECTID], SampleDate, 
    Collector, Parameter, Result, Unit, 
    WellGlobalID, GlobalID 
FROM 
    WellSamples 
WHERE 
    SampleDate IN (SELECT MAX(SampleDate) 
        FROM WellSamples 
        GROUP BY WellGlobalID); 
+0

要麼ROW_NUMBER(或等級((取決於是否可以有多個)和分區按採樣日期desc排序。例如'select top 1000 * from(select *,row_number()over(由參數分區,wellglobalid order by sampledate desc)from wellsamples)t其中rn = 1;'有數百個其他問題提出這個完全相同的問題,儘管。 – ZLK

回答

3

使用ROW_NUMBER功能。

SELECT * 
FROM (
    SELECT w.*, 
     ROW_NUMBER() OVER(PARTITION BY parameter,wellglobalid 
         ORDER BY sampledate DESC) as RN 
    FROM WellSamples w 
) x 
WHERE RN = 1 
+0

棒極了,只是嘗試過,它的工作!非常感謝。你節省了我一些時間。 – Peter

1

ROW_NUMBER將是我的解決方案https://msdn.microsoft.com/en-us/library/ms186734.aspx

SELECT 
    [OBJECTID] 
    ,SampleDate 
    ,Collector 
    ,Parameter 
    ,Result 
    ,Unit 
    ,WellGlobalID 
    ,GlobalID 
FROM ( 
    SELECT 
     [OBJECTID] 
     ,SampleDate 
     ,Collector 
     ,Parameter 
     ,Result 
     ,Unit 
     ,WellGlobalID 
     ,GlobalID 
     ,ROW_NUMBER() OVER (PARTITION BY Parameter, WellGlobalID ORDER BY  SampleDate DESC) AS [ROW_NUM] 
    FROM WellSamples 
    ) tbl 
WHERE ROW_NUM = 1 

您需要子查詢,因爲窗函數(ROW_NUMBER)不能在where子句中使用。

0

你也可以用子查詢來做到這一點。首先找到最近的每個參數的日期,然後加入其他數據,如:))由參數/ globalid

SELECT w.parameter, w.sampledate, w.result, w.wellglobalid 
FROM wellsamples w 
INNER JOIN 
(SELECT MAX(sampledate) AS mxdate, parameter 
FROM wellsamples 
GROUP BY parameter) sub 
ON w.parameter = sub.parameter 
AND w.sampledate = sub.mxdate