1

データベースに 2 つのテーブルがあります。

log_visitors:
--------------------
id | host_id


log_access:
--------------------
visitor | document | timestamp

log_access.visitorへのリンクlog_visitors.id

現在、私はこのクエリを使用しています:

SELECT
    log_visitors.host_id
    , MIM(log_access.timestamp) AS min_timestamp
FROM
    log_access
    INNER JOIN log_visitors
        ON (log_access.visitor = log_visitors.id)
GROUP BY log_visitors.host_id;

MIN(timestamp)データベース内のそれぞれを取得しhost_idます。

これが私の質問です:

documentまた、そのタイムスタンプでそのアクセスを取得する必要があります...log_access.documentそれは定数ではなく、ドキュメントごとにグループ化していないため、単純に SELECT リストに追加することはできません...何かアイデアはありますか?

4

2 に答える 2

5

DBMS を指定しませんでしたが、これは ANSI SQL です (最新の DBMS のほとんどで動作します)。

select *
from (
  SELECT log_visitors.host_id,
         log_visitors.document,
         log_access.timestamp
         min(log_access.timestamp) OVER (partition by log_visitors.host_id) AS min_timestamp
  FROM log_access
    JOIN log_visitors ON (log_access.visitor = log_visitors.id)
) t
where t.timestamp = t.min_timestamp
ORDER BY host_id
于 2012-11-02T16:53:07.907 に答える
3

次のようなもので、必要なものが得られるはずです。

SELECT      lv.host_id,
            mv.MinTime,
            la.document

FROM        log_visitors AS lv
INNER JOIN     
            (SELECT visitor, 
                    MIN(timestamp) AS MinTime 
             FROM log_access 
             GROUP BY visitor) AS mv ON lv.id = mv.visitor
INNER JOIN  log_access AS la ON lv.id = la.visitor AND mv.MinTime = la.timestamp

すべての訪問者のリストとテーブル内の最小タイムスタンプを取得し、それに結合してから、タイムスタンプのログ アクセスに結合して、特定のドキュメントを選択します。

これは ANSI SQL-92 を使用するため、ウィンドウ関数をサポートしていないものも含め、幅広いデータベース システムで動作するはずです。

これは、 Sql Fiddleを介した実行中のクエリの例です。

于 2012-11-02T16:53:59.727 に答える