我的数据库中有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列表中,因为它不是常量而我不按文档分组。 。
有什么想法吗?
答案 0 :(得分: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
答案 1 :(得分: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
执行查询的示例