適切なインデックスが定義されていると仮定すると、指定された結果セット (つまり 1 行) を取得する最も効率的な方法は次のようになります。
SELECT VoerID
, Datum
, Status
, LogID
FROM DB.Log
WHERE VoerID = '1051'
ORDER
BY VoerID DESC
, LogID DESC
LIMIT 1
複数の VoerID (各 VoerID の MAX(LogID) など) の最新行を取得するには、インライン ビューに対して JOIN 操作を使用できます。
SELECT l.VoerID
, l.Datum
, l.Status
, l.LogID
FROM (
SELECT k.VoerID
, MAX(k.LogID) AS LogID
FROM DB.Log k
GROUP BY k.VoerID
) m
JOIN DB.Log l
ON l.VoerID = m.VoerID AND l.LogID = m.LogID
ORDER BY l.VoerID ASC
両方のクエリのパフォーマンスのために、インデックスを定義する必要がありますON (VoerID, LogID)
ファローアップ
Q:ステータスごとに VoerID の数も数えたいです。月末にそれを行うことは可能ですか?次に、列のタイムスタンプ logID も考慮する必要があります...
A: その Datum 列がタイムスタンプ列であるとは認識していませんでした。
特定のステータスの行が発生した VoerID の単純な数を取得するには、次のようにします。
SELECT l.Status
, COUNT(DISTINCT l.VoerID)
FROM DB.Log l
GROUP BY l.Status
「月末」への言及は、いくつかの異なる方法で解釈できます。月内の最新の LogID が特定のステータスである VoerID のカウントが必要でしたか、それとも、月内の特定のステータスを持つ VoerID をカウントに含める必要がありましたか。
探している結果セットは明確ではありませんが、これでアイデアが得られるかもしれません。
タイムスタンプ列の関数である式を追加して、タイムスタンプから年と月を取得することができます。
DATE_FORMAT(timestampcol,'%Y-%m') AS yyyymm
それを日付として返したい場合 (コードで文字列を扱うよりも便利な場合)、たとえば、月の最初の日のように:
DATE_FORMAT(timestampcol,'%Y-%m-01') + INTERVAL 0 DAY AS yyyymm
(その列が文字列であり、DATE、DATETIME、または TIMESTAMP 列ではない場合、クエリ内で変換するために使用できる関数があります。)
上記のクエリによって返される行のように、各 VoerID の「最新の」LogID のみを確認する場合は、次のようにします。
SELECT l.status
, m.yyyymm
, COUNT(DISTINCT m.VoerID) AS count_distinct_voerid
FROM (
SELECT k.VoerID
, DATE_FORMAT(k.timestampcol,'%Y-%m-01') + INTERVAL 0 DAY AS yyyymm
, MAX(k.LogID) AS LogID
FROM DB.Log k
GROUP
BY k.VoerID
, DATE_FORMAT(k.timestampcol,'%Y-%m-01') + INTERVAL 0 DAY
) m
JOIN DB.Log l
ON l.VoerID = m.VoerID AND l.LogID = m.LogID
ORDER BY m.yyyymm DESC, l.status ASC
(実際には、キーワード DISTINCT は省略できます。(LogID) が一意である、または (VoerID,LogID) が一意であると仮定すると、この例では冗長になります。)