2011-01-17 32 views
1

をグループ化された日付列から最大を取得:ここ私は、このような表持つ特定のフィールドで

LogId RefId Entered 
================================== 
1  1  2010-12-01 
2  1  2010-12-04 
3  2  2010-12-01 
4  2  2010-12-06 
5  3  2010-12-01 
6  1  2010-12-10 
7  3  2010-12-05 
8  4  2010-12-01 

を、LOGIDはユニークです。 RefIdごとに、タイムスタンプ付きの複数のエントリがあります。私が抽出したいのは、最新のRefIdごとにLogIdです。

このリンクからの解決策を試しました。http://stackoverflow.com/questions/121387/sql-fetch-the-row-which-has-the-max-value-for-a-columnしかし、同じRefIdを持つ複数の行を返します。 LogIdとRefIdは一意でなければなりません。

誰かがこれを手伝ってくれますか?

おかげ

Vamyip

+0

どのデータベースエンジンを使用していますか?およびどのバージョンですか? – Lamak

+0

@Lamak MS SQL 2000. – vamyip

+1

@Dylan Beattieによって与えられたソリューションが重複レコードを返す場合、解決は正しいので、同じRefidの最大日付は同じです。 – Lamak

答えて

3

あなたが入力した、各REFIDの最新入力された値を抽出し、サブクエリを使用して、REFIDにこれにソース表を結合する必要があります。

SELECT DISTINCT MyTable.LogId, MyTable.Entered FROM MyTable 
INNER JOIN (SELECT RefId, MAX(Entered) as Entered FROM MyTable GROUP BY RefId) Latest 
ON MyTable.RefId = Latest.RefId AND MyTable.Entered = Latest.Entered 
+0

それでも重複したレコードが返されます。また、Joinの右側にあるfrom節を忘れてしまった。しかし、あなたの迅速な返信をありがとう。 – vamyip

+0

@Lamakは正しいです。結果は同じrefidの最大日付が同じでした。返信いただきありがとうございます。 – vamyip

0

自動インクリメントのログIDが表示されるため、日付/時刻は順次に記録されます。したがって、参照IDごとに最後のLogIDを取得することで、下の「PreQuery」に「最新のもの」が表示され、その単一のIDに基づいて元のテーブルに参加し、実際の日付スタンプ情報(またはその他の詳細)あなたは実際のログから必要です。

select PreQuery.RefID, 
     PreQuery.LastLogEntry, 
     L.Entered 
    from 
     (select RefID, 
       Max(LogID) LastLogEntry 
      from 
       YourLog 
      group by 
       RefID) PreQuery, 
     YourLog L 
    where 
     PreQuery.LastLogEntry = L.LogID 
0

正しく重複を処理するには、次の

SELECT m.* 
FROM (
     SELECT DISTINCT refid 
     FROM mytable 
     ) md 
JOIN mytable m 
ON  m.LogID = 
     (
     SELECT LogID 
     FROM mytable mi 
     WHERE mi.refid = md.refid 
     ORDER BY 
       mi.refid DESC, mi.entered DESC, mi.logid DESC 
     LIMIT 1 
     ) 

が、これは、高速動作させるためにmytable (refid, entered, logid)にインデックスを作成します。

関連する問題