请看下面的sql小提琴。
http://sqlfiddle.com/#!6/26b91/1
我将首先尝试描述我需要的输出。我期待两行,因为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子句,并且由于两个条件不同,只返回了一行详细信息。
谢谢
我将尝试提供更多信息。
答案 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
答案 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