2009-12-04 96 views
0

我以为我有,但似乎我错了。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”。

我有什么意义吗?

回答

1

没有任何模式它是一点点困难。但是,你需要尝试越来越id值和最大值(所以你的情况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的最新数据

+1

+1:可以使用表别名 - 不太可能滚动屏幕。 – 2009-12-04 16:38:15

+0

感谢您的回复!我决定将不同的查询拆分开来,因为还有更多的参数需要加入。所以我使用了c#和querries的组合来完成这项工作,经过一些测试后,也给出了最好的表现。 – WtFudgE 2009-12-07 11:07:13

1

在你的第二个查询中,你说你想为每个唯一的PrestatieCode排列一个行。因此,具有相同PrestatieCode的可能几行的结果集合将合并成一行。给出PrestatieCode的值,因为它在所有这些行中都是相同的(如果我们正在考虑一个特定的组)。 Uitvoerdatum的值也很容易:您要让服务器选择最大值。那么Identificate呢?它可能有几个不同的值,并且你没有指定选择哪一个。如果没关系,你也可以做max(Identificate)。如果你知道它们总是相同,那么对于所有PrestatieCode s都是相同的,你可以放心地将该值放入group by子句中。

无论你决定,你需要给在SQL Server关于哪些值你感兴趣的一些线索。

+1

没错。 如果其他列始终是相同的值,只是日期更改,您可以将它们按这些值分组或使用MAX.如果它们确实无关紧要,并且您不需要它们,请将它们从您的选择中删除。 – 2009-12-04 16:11:14

+0

哈哈,好吧,这是比我更好的方法,嘿?我试图覆盖错误消息的聚合函数*部分,但是,这是一个无意义的例子。 – 2009-12-04 16:32:26

0

您还可以在“from”子句的子查询中放入第二个(尽可能简化,因为您只需要两列),给它一个名称,并在连接中使用它来限制第一个查询到具有来自第二查询的值的行。

0

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