2017-01-18 106 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