0

次のようなテーブルがあります。

VoerID   LogID  Status  Datum

1051        93  F   vr 08 okt 2004

1051    1037    A   di 19 okt 2004

1051    8955    A   di 18 jan 2005

1051    43972   A   wo 07 sep 2005

….  ….  ….. ……..

44444   10000000    V   someday 2013

だからVoerID私はいくつかのを持っていLogIDます。私が見たいのは、最新のlogIDあたりVoerIDです。VoerID例として、 1051のみを見ていきます。

これまでにこれを行いました:

select Voer.ID, Datum, Status, maxLogID 
from  (SELECT VoerID, Datum, Status, MAX(LogID) as maxLogID 
FROM DB.Log group by VoerID order by Status)t1 where VoerID = '1051'

これを実行すると答えは

VoerID  LogID   Status  Datum

1051    43972   F   vr 08 okt 2004

そのため、最新の LogId を取得しますが、対応する Status と Date は取得しません。

これを修正する方法は?

4

3 に答える 3

1

二重選択でこれを本当にやりたいのなら、これを書く最も簡単な方法は...

    SELECT v.VoerID,v.LogID,v.Status,v.Datum From tableName v 
    INNER JOIN (Select MAX(LogID) as lastID, VoerID FROM tableName GROUP BY VoerID) r 
    ON v.LogID=r.lastID ORDER BY v.VoerID DESC

それが最速または最良の方法だと言っているわけではありませんが、提供されたデータと提供されたクエリは、あなたが達成しようとしていたように見えます. 微調整が必​​要な場合は、お知らせください。

于 2013-07-08T15:06:40.060 に答える
1

適切なインデックスが定義されていると仮定すると、指定された結果セット (つまり 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) が一意であると仮定すると、この例では冗長になります。)

于 2013-07-08T14:56:39.000 に答える
0

LogID が常に増加している場合は、これを使用できます。

SELECT *
FROM yourtable
WHERE (VoerID, LogID) IN (SELECT VoerID, MAX(LogID)
                          FROM yourtable
                          GROUP BY VoerID)

サブクエリはすべての VoerID の最大 LogID を返し、外側のクエリはすべての voerid の最大 logid を持つすべての行を返します。

于 2013-07-08T14:52:54.720 に答える