SQL查询以获取具有多个分组的最新记录

时间:2017-01-18 22:27:11

标签: sql sql-server

我正在使用SQL Server 2014和Management Studio。让我试着解释一下我在做什么。

我有一个类似于以下(非常简化)的表

enter image description here

我想创建一个查询,如果Well Global 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);

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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子句中使用。

答案 2 :(得分:0)

您也可以使用子查询执行此操作。首先找到每个参数的最新日期,然后加入其余数据,如下所示:

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