2011-08-09 9 views
3

私はただのように見えるものに取り掛かっていますが、構文を理解することはできません。私は、料金が変更された日付と従業員IDに関連付けられた支払率のテーブルを持っています。従業員一人あたり複数のレコード。テーブルから最新の給料を引っ張ってみよう

私は最新の日付のリストと、その日付からの賃金を取得しようとしています。私は試しました: SELECT MAX(日付)、レート、EmpID FROM履歴

しかし、それは動作しません。それはそれぞれの賃金率の記録を返すようです。

これを効率的に行う方法は他にありますか?

答えて

5

これは、あなたの各EmpIDについてRate最新情報を提供します。

select [Date], 
     Rate, 
     EmpID 
from (select [Date], 
      Rate, 
      EmpID, 
      row_number() over(partition by EmpID order by [Date] desc) as rn 
     from History) as H 
where rn = 1 

ここで試してみてください:http://data.stackexchange.com/stackoverflow/q/109020/

+0

一般に、ROW_NUMBER()は、相関集約サブクエリよりも優れたパフォーマンスを発揮します。 –

+0

これはうまくいきます。ありがとうございました。私は前にROW_NUMBER()を使ったことがありません。 – beauk

+1

私は、これをサブクエリでMAX(日付)で動作させることができましたが、それはいいです混乱の価値はありません。 ROW_NUMBER()を使用する方がはるかに優れています。また、私を投げていた部分は、日付フィールドがvarcharであったため、この解決策やMAX()サブクエリは期待どおりに機能していませんでした。いったん私がそれをキャッチし、CAST([日付]をdatetimeとして)、それは働いた。投稿前にそのデータタイプをチェックしたと思ったが、二重チェックをする必要がある。私が言ったように、ミカエル・エリクソンの提案は、はるかに良いので、私はしなかったことがうれしいです。 – beauk

2
SELECT Date, Rate, EmpID 
FROM History A 
WHERE Date = (
      SELECT Max(Date) 
      FROM History B 
      WHERE A.EmpID = B.EmpId) 
+0

@JoeStefanelli - 多くの従業員が同じ日付を共有する可能性があるので、私は、この作品とは思わない、と一人の最新の日付はanothersではないかもしれません。または私は何かを逃していますか? – beauk

+0

@AncientAnt:これは私の答えではありません。コードの書式を編集するだけでした。それが価値あるものであれば、私はMikael Erikssonの答えをより良い選択肢として選んだ。 –

+0

@JoeStfanelli:私の間違い。助けてくれてありがとう! – beauk

0
select * 
from payrates 
where date = (select max(dates) 
       from payrates); 
関連する問題