选择多行的最新行值

时间:2015-07-16 18:42:36

标签: sql sql-server sql-server-2014

请看下面的sql小提琴。

http://sqlfiddle.com/#!6/26b91/1

Latest SQL Fiddle is here

我将首先尝试描述我需要的输出。我期待两行,因为PullPointDate表中有两个条件。 PullPoint表中的多行由于审计数据而存在,条件1的审计值从1到3,条件2的审计值从1到2.您可以看到有可能对数据进行多次审核。完整数据集中的其他列显然正在发生变化,但我没有将它们包含在此处,因为它们不相关。不用说,它们可能是(n)条件和相关的拉点审计变更数据。

CondNumber,  StudyCode,  PullPeriod, PullUnit
1         ,   SS3105  ,   52       , Weeks
2         ,   SS3105  ,   24       , Weeks

PullPoint表格中的其他行不应包含在结果中,因为它们比旧版AuditNumber更早,但不是AuditNumber

我已经挣扎了很长一段时间。我的思绪很难以一套基于时尚的方式思考。嵌套的Row_Over,Partition By等让我在冷汗中爆发。

我如何实现这一点,我能得到的最接近的一行看起来很完美,但另一个值为null,因为我在审计编号上做了一个where子句,并且由于两个条件不同,只返回了一行详细信息。

谢谢

我将尝试提供更多信息。

4 个答案:

答案 0 :(得分:0)

这样做:

select distinct condNumber, pp.studycode, pullperiod, pullunit 
from PullPoint pp
join PullPointDate ppd on ppd.studycode = pp.StudyCode
and pp.batchCode = ppd.batchcode

fiddle here

答案 1 :(得分:0)

这似乎给了我我想要的东西......

SELECT o。* 从拉点o
  LEFT JOIN拉力点b
      ON o.studyCode = b.studyCode       和o.batchCode = b.batchcode        AND o.auditNumber< b.AuditNumber WHERE b.AuditNumber为NULL

我相信我明天会开始工作但事情不会奏效:(

答案 2 :(得分:0)

对于来自BatchCode的每个PullPointDate,我们会查找PullPoint中使用AuditNumber的{​​{1}}最大的一行。这是SQL Fiddle。我使用您的http://sqlfiddle.com/#!6/b1e79/2作为样本数据来源。

目前尚不清楚是否需要在CROSS APPLY上加入两个表格。如果有必要,只需将StudyCode添加到AND PullPoint.StudyCode = CTE.StudyCode条件。

WHERE

答案 3 :(得分:0)

除了Vladimir Baranov的回答,您还可以将CTE与Row_Number一起使用: SQLFiddler

WITH CTE 
AS 
(
 SELECT ROW_NUMBER () OVER (PARTITION BY  
         P.BatchCode ORDER BY P.AuditNumber Desc) RN ,
         P.StudyCode , P.BatchCode ,  
         PP.condNumber ,P.pullunit , P.PullPeriod
          FROM pullpoint P
          JOIN PullPointDate PP
          ON P.BatchCode = PP.BatchCode 

 )

  SELECT  StudyCode , 
          BatchCode ,  
          condNumber ,
          pullunit , 
          PullPeriod
 FROM CTE
 WHERE RN = 1