我正在使用SQL Server 2014和Management Studio。让我试着解释一下我在做什么。
我有一个类似于以下(非常简化)的表
我想创建一个查询,如果Well Global ID相同,它将获取每个参数的最新记录。我想要的将如下所示:
由于我不是一个伟大的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 :(得分: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