2016-08-25 7 views
1

レポートの最大日付と詳細を取得しようとしていますが、最新のエントリの詳細ではなく、特定の期間内のすべてのエントリが返されます。TSQLのさまざまな最大日付オプションが機能しない

テーブル名がdbo.vwPupil_EventTypeある:

テキスト、ntext型およびイメージデータ型を比較す​​ることができない

SELECT [Pupil ID], [Event Date],[Header Note], [Module ID], [Event ID] AS ID 
FROM  dbo.vwPupil_EventType EV 
WHERE ([Module ID] = 22) 
GROUP BY [Event ID],[Pupil ID], [Event Date],[Header Note],[Module ID] 
HAVING [Event Date]IN (SELECT MAX([Event Date]) 
         FROM  dbo.vwPupil_EventType 
         WHERE EV.[Event ID] = [Event ID]) 
ORDER BY [Pupil ID] 

EventID (int,not null) 
PupilID (int,not null) 
EventDate (datetime,null) 
Header Note(text,null) 
Event Type (varchar(100),null) 
Module ID (int,null) 

1試行がエラーMSG 306を生成しましたこれらの他の2つのオプションを試しましたが、dat内のすべてのエントリを取得していますだけでなく、最新の1のEスパン:

SELECT [Pupil ID], [Event Date], CAST([Header Note]AS VARCHAR(100))NOTE, [Module ID], [Event ID] AS ID 
FROM  dbo.vwPupil_EventType EV 
WHERE ([Module ID] = 22) 
GROUP BY [Event ID],[Pupil ID], [Event Date],CAST([Header Note]AS VARCHAR(100)),[Module ID] 
HAVING [Event Date]IN (SELECT MAX([Event Date]) 
         FROM  dbo.vwPupil_EventType 
         WHERE EV.[Event ID] = [Event ID]) 
ORDER BY [Pupil ID] 

は、これは一般的に窓関数を使用して解決される

SELECT [Pupil ID], MAX(CAST([Event Date] AS DATETIME)), CAST([Header Note]AS VARCHAR(100))NOTE, [Module ID], [Event ID] AS ID 
FROM  dbo.vwPupil_EventType EV 
WHERE ([Module ID] = 22) 
GROUP BY [Event ID],[Pupil ID], [Event Date],CAST([Header Note]AS VARCHAR(100)),[Module ID] 
HAVING [Event Date]IN (SELECT MAX([Event Date]) 
         FROM  dbo.vwPupil_EventType 
         WHERE EV.[Event ID] = [Event ID]) 
ORDER BY [Pupil ID] 
+0

役立つかもしれない私は、サブクエリでも '[イベント日付であれば、where句の必要性を全く考えていません] 'はdatetime型ではないので、サブクエリでもサブクエリにもキャストする必要があります。 –

+0

こんにちはJaydipJ、返信いただきありがとうございます。応答はあまり役に立ちません.Sqlの新機能、見た目の例〜のような助けて – newangie

答えて

0

を試してみました:

select [Pupil ID], [Event Date],[Header Note], [Module ID], [ID] 
from (
    SELECT [Pupil ID], [Event Date],[Header Note], [Module ID], [Event ID] AS ID, 
      row_number() over (partition by [Pupil ID] order by [Event Date] desc) as rn 
    FROM  dbo.vwPupil_EventType EV 
    WHERE [Module ID] = 22 
) t 
where rn = 1; 

同じで複数の行がある場合」あなたはそのうちの1つだけを取得します。あなたがしたい場合は、それらのすべてではなくrow_number()

+0

こんにちはa - 馬...あなたの例を提供していただきありがとうございます...私は実際にはパーティション以上で働いていないが、それを行くだろう – newangie

+0

こんにちは、後スクリプトを適用するとメッセージが表示されます....メッセージ208、レベル16、状態1、行1 オブジェクト名 'dbo.vwPupil_EventType'が無効です。 – newangie

+0

@newangie:明らかに、あなたの質問に書かれていることにもかかわらず、 'dbo.vwPupil_EventType'というテーブルはありません –

0

の使用dense_rank()を返された、私はあなたの要件を理解している場合、正しく彼らこれはあなた

SELECT [Pupil ID], 
     [Event Date], 
     CAST([Header Note]AS VARCHAR(100)) NOTE, 
     [Module ID], 
     [Event ID] AS ID 
FROM  dbo.vwPupil_EventType EV 
WHERE [Module ID] = 22 
     AND CAST([Event Date] AS DATETIME) = (SELECT MAX(CAST([Event Date] AS DATETIME)) 
               FROM dbo.vwPupil_EventType) 
ORDER BY [Pupil ID] 
関連する問題