SQL最新日期

时间:2009-12-04 16:00:27

标签: 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_AllInstances as pAll on 
zRel.ReferenceData = pAll.ActivityID
where zAll.Zender = 'BL15' 
and ReferenceType = 'Activity' 
and Zendingnummer = '632'

这显示了PrestatieCodes列表,也是重复列表。 现在我只需要一个没有重复项的PretatieCodes列表,它应该选择具有最新日期的那个。 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

这给了我想要的东西。但是你可以注意到它没有2列“Identificatie”和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”。

我有意义吗?

4 个答案:

答案 0 :(得分:1)

在第二个查询中,您说每个唯一PrestatieCode都需要一个行。因此,具有相同PrestatieCode的可能多个行的结果集将合并为一行。给出PrestatieCode的值,因为它在所有这些行中是相同的(如果我们考虑一个特定的组)。 Uitvoerdatum的值也很简单:您告诉服务器只选择最大值。那么Identificate呢?它可能有几个不同的值,您没有指定要选择哪一个。如果无关紧要,您也可以max(Identificate)。如果您知道它们总是相同的,那么对于所有相同的PrestatieCode,您也可以安全地将该值放入group by子句中。

无论你决定什么,你都需要给sql server一些关于你感兴趣的值的线索。

答案 1 :(得分:1)

没有任何架构,这有点困难。但你需要尝试的是获取id和max值(所以在你的情况下,PrestatieCode和MAX(Uitvoerdatum),然后做一个子连接)

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

这可以获得每个PrestatieCode的最新数据

答案 2 :(得分:0)

您还可以在“from”子句中的子查询中添加第二个(尽可能简化,因为您只需要两列),为其命名,并在连接中使用它来限制输出对具有第二个查询值的行的第一个查询。

答案 3 :(得分:0)

我认为您的问题已在here之前得到解答。您会注意到最佳解决方案取决于您使用的服务器,因为许多服务器具有改进这些查询的特殊功能。