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 回答