19

重複の可能性:
最大値を含むテーブルのレコードを取得する方法は?

次のような集計クエリがあります。

SELECT TrainingID, Max(CompletedDate) as CompletedDate, Max(Notes) as Notes     --This will only return the longest notes entry
FROM HR_EmployeeTrainings ET
WHERE (ET.AvantiRecID IS NULL OR ET.AvantiRecID = @avantiRecID)
GROUP BY AvantiRecID, TrainingID            

これは機能しており、ほとんどの場合正しいデータを返しますが、問題に気付きました。返される Notes フィールドは、必ずしも max(completedDate) の元のレコードと一致するとは限りません。代わりに、最も長い文字列を持つものになりますか? それともASCII値が最も高いものですか?2 つのレコードが一致した場合、SQL Server は何をしますか? よくわかりません。私が取得したいのは、max(completedDate) レコードの notes フィールドです。これを行うにはどうすればよいですか?

4

4 に答える 4

26

サブクエリを使用できます。サブクエリはMax(CompletedDate). 次に、この値を取得してテーブルに再度結合し、その日付に関連付けられたメモを取得します。

select ET1.TrainingID,
  ET1.CompletedDate,
  ET1.Notes
from HR_EmployeeTrainings ET1
inner join
(
  select Max(CompletedDate) CompletedDate, TrainingID
  from HR_EmployeeTrainings
  --where AvantiRecID IS NULL OR AvantiRecID = @avantiRecID
  group by TrainingID
) ET2
  on ET1.TrainingID = ET2.TrainingID
  and ET1.CompletedDate = ET2.CompletedDate
where ET1.AvantiRecID IS NULL OR ET1.AvantiRecID = @avantiRecID
于 2012-10-17T20:01:24.657 に答える
6

ああ、それが SQL で意図されている方法です。すべての列の最大値を個別に取得します。最大日付の行から値を返したいようですので、最大日付の行を選択する必要があります。クエリはコンパクトで読みやすいので、副選択でこれを行うことを好みます。

SELECT TrainingID, CompletedDate, Notes
FROM HR_EmployeeTrainings ET 
WHERE (ET.AvantiRecID IS NULL OR ET.AvantiRecID = @avantiRecID) 
AND CompletedDate in 
   (Select Max(CompletedDate) from HR_EmployeeTrainings B
    where B.TrainingID = ET.TrainingID)

AntiRecID で一致させたい場合は、それもサブセレクトに含める必要があります。

于 2012-10-17T20:03:16.473 に答える
3

これを行う簡単な方法はありませんが、次のような方法でうまくいきます。

SELECT ET.TrainingID, 
  ET.CompletedDate, 
  ET.Notes
FROM 
HR_EmployeeTrainings ET
inner join
(
  select TrainingID, Max(CompletedDate) as CompletedDate
  FROM HR_EmployeeTrainings
  WHERE (ET.AvantiRecID IS NULL OR ET.AvantiRecID = @avantiRecID)
  GROUP BY AvantiRecID, TrainingID  
) ET2 
  on ET.TrainingID = ET2.TrainingID
  and ET.CompletedDate = ET2.CompletedDate
于 2012-10-17T20:01:12.860 に答える
3

各 MAX 関数は個別に評価されます。したがって、MAX(CompletedDate) は最新の CompletedDate 列の値を返し、MAX(Notes) は最大 (アルファベット順で最も高い) 値を返します。

必要なものを取得するには、クエリを別の方法で構造化する必要があります。この質問は、実際にはすでに何度か尋ねられ、回答されているため、繰り返しません。

最大値を含むテーブル内のレコードを見つける方法は?

SQLで最大値を持つレコードを見つける

于 2012-10-17T20:02:57.207 に答える