2009-12-04 98 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之前得到解答。您會注意到,最好的解決方案取決於您使用的服務器,因爲許多解決方案都具有改進這些查詢的特殊功能。