SQL最新日期
我以为我有,但似乎我错了 我有一个问题SQL最新日期,sql,Sql,我以为我有,但似乎我错了 我有一个问题 select PrestatieCode, Uitvoerdatum, Identificatie, Foutmelding from bam_Zending_AllInstances as zAll left outer join bam_Zending_CompletedRelationships as zRel on zAll.ActivityID = zRel.ActivityID left outer join bam_Prestatie_A
select PrestatieCode, Uitvoerdatum, Identificatie, Foutmelding
from bam_Zending_AllInstances as zAll
left outer join bam_Zending_CompletedRelationships as zRel on
zAll.ActivityID = zRel.ActivityID
left outer join bam_Prestatie_AllInstances as pAll on
zRel.ReferenceData = pAll.ActivityID
where zAll.Zender = 'BL15'
and ReferenceType = 'Activity'
and Zendingnummer = '632'
这显示了一个预编码列表,也有重复项。
现在我只需要有一个没有副本的preatiecodes列表,它应该只选择一个最新日期。datecolumn=Uitvoerdatum
我想我应该试试这样的东西:
select max(Uitvoerdatum), PrestatieCode
from bam_Zending_AllInstances as zAll
left outer join bam_Zending_CompletedRelationships as zRel on
zAll.ActivityID = zRel.ActivityID
left outer join bam_Prestatie_AllInstances as pAll on
zRel.ReferenceData = pAll.ActivityID
where zAll.Zender = 'BL15'
and ReferenceType = 'Activity'
and Zendingnummer = '632'
group by PrestatieCode
这就是我想要的。但是,正如您所注意到的,它没有两列“Identification”和Foutmelding。如果我加上这些,就会得到错误
Column 'bam_Prestatie_AllInstances.Identificatie' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
所以我猜我的方法是错误的。我需要查看所有列,但只查看最新的“PrestatieCode”
我说的有道理吗?在第二个查询中,您是说希望每个唯一的
PrestatieCode
对应一行。因此,可能包含多行且具有相同的PrestatieCode
的结果集将合并为一行。给出了PrestatieCode
的值,因为它在所有这些行中都是相同的(如果我们考虑一个特定的组)。Uitvoerdatum
的值也很简单:您告诉服务器只选择最大值。那么,identicate
呢?它可能有几个不同的值,您还没有指定要选择哪个值。如果没有关系,您也可以使用max(identicate)
。如果您知道它们总是相同的,那么对于所有相同的PrestatieCode
s,您也可以安全地将该值放入groupby
子句中
无论您决定什么,都需要向sql server提供一些关于您感兴趣的值的线索。没有任何模式,这有点困难。但是您需要尝试的是获取id和max值(因此在您的示例中,是PrestatieCode和max(Uitvoerdatum),然后执行一个子连接)
这将根据PrestatieCode获取最新数据。您还可以将第二个数据(尽可能简化,因为您只需要两列)放在“from”子句的子查询中,给它一个名称,并在联接中使用它将第一个查询的输出限制为具有第二个查询的值的行。我想您的问题以前已经得到了回答。您会注意到,最好的解决方案取决于您使用的服务器,因为许多服务器具有改进这些查询的特殊功能。没错。如果其他列总是相同的值,只是日期发生了变化,你可以根据这些值对它们进行分组,或者使用MAX。如果它们真的不重要,你也不需要它们,只需从选择中删除它们。哈哈,是的,这是一种比我的更好的方法,嘿?我试图在错误消息的聚合函数部分涵盖这两个选项,但这是一个毫无意义的示例。+1:可以使用表别名-不太可能滚动到屏幕外。感谢回复!我决定将查询拆分为不同的查询,因为需要连接更多的参数。因此,我使用了c#和query的组合来完成这项工作,经过一些测试后,这项工作也提供了最好的性能。
SELECT YourTabel.*
FROM YourTabel INNER JOIN
(
SELECT PrestatieCode,
MAX(Uitvoerdatum) MaxDates
FROM YourTabel
WHERE YourCondition
GROUP BY PrestatieCode
) YourTableMaxDates ON YourTabel.PrestatieCode = YourTableMaxDates.PrestatieCode
AND YourTabel.Uitvoerdatum = YourTableMaxDates.MaxDates