0

在我的数据库 postgresql 版本上发生了一场小灾难。8.4. 请帮帮我!

我必须在两个表格中关注我的网页上的访问者,例如:

历史

whereseenlast varchar(50)
uniqid varchar(13) 主键
whenseenlast 时间戳
bla1 varchar(10)
bla2 varchar(10)
bla3 varchar(10)

示例

where1.html, **1**, 2000-01-01 00:00:00, somebla1, somebla2, somebla3
where2.html, **1**, 2005-05-05 05:06:07, somebla1, somebla2, somebla3
...
where12345.html, **1**, 2012-11-22 11:22:33, somebla1, somebla2, somebla3

TABLE访问者(uniqid 为主键,每个访问者在该表中只能找到一次)

wherseenfirst varchar(50)
whereseenlast varchar(50)
whenseenfirst 时间戳
whenseenlast 时间戳
uniqid varchar(13) 主键
注释 varchar (20)
xyz varchar(20)

示例

where1.html, where12345.html, 2000-01-01 00:00:00, 2012-11-22 11:22:33, 1, somenote, somexyz 

我不小心删除了 TABLE 访问者并且我没有备份。但是,我相信专家很容易通过查询从 TABLE 历史中重建 TABLE 访问者。

(我知道我将无法从 TABLE历史记录中恢复注释xyz列,但这没什么大不了的)

你能建议解决方案吗?

4

3 回答 3

0

这是你的数据库课的家庭作业吗?

您首先必须为每个访问者从历史记录中选择最新和最早的行:

select uniqid, max(whenseenlast) from history group by uniqid

select uniqid, min(whenseenlast) from history group by uniqid

然后为您的历史记录表选择与它们匹配的记录,如下所示:

select frst.uniqid, whenseenfirst, whereseenfirst, whenseenlast, whereseenlast
from
(select h.uniqid, mn.mnseen as whenseenfirst, h.whereseenlast as whereseenfirst
    from history h
    join (select uniqid, min(whenseenlast) as mnseen from history group by uniqid) mn
    on mn.mnseen = h.whenseenlast and mn.uniqid = h.uniqid) frst,
(select h.uniqid, mx.mxseen as whenseenlast, h.whereseenlast as whereseenlast
    from history h
    join (select uniqid, max(whenseenlast) as mxseen from history group by uniqid) mx
    on mx.mxseen = h.whenseenlast and mx.uniqid = h.uniqid) lst
where frst.uniqid = lst.uniqid

您可以在SQLFiddle上验证它

于 2012-12-12T16:35:46.013 回答
0

尝试:

SELECT DISTINCT ON (uniqid) *
FROM history
ORDER BY uniqid, whenseenlast DESC

它将为您提供每个用户(每个DISTINCT uniqid)的最后历史记录。

SELECT DISTINCT ON (uniqid) *
FROM history
ORDER BY uniqid, whenseenlast

获得第一个历史记录。

INSERT INTO visitors (uniqid, whereseenlast, whenseenlast, whenseenfirst, whenseenlast ...)
SELECT seen_last.uniqid, seen_last.whereseenlast, seen_last.whenseenlast, seen_first.whereseenlast, seen_first.whenseenlast ...
FROM 
     (SELECT DISTINCT ON (uniqid) *
      FROM history
      ORDER BY uniqid, whenseenlast DESC) seen_last
JOIN
     (SELECT DISTINCT ON (uniqid) *
      FROM history
      ORDER BY uniqid, whenseenlast) seen_first
  ON seen_last.uniqid = seen_first.uniqid

它将重建您的表。

详细信息:DISTINCT ON

于 2012-12-12T16:37:51.777 回答
0

选择 h1.uniqid, h1.whereseenlast 作为 whereseenfirst, h1.whenseenlast 作为 whenseefirst, h3.whereseenlast, h3.whenseenlast 从历史 h1 离开加入历史 h2 在 h1.uniqid = h2.uniqid 和 h1.whenseenlast < h2.whenseenlast

在 h1.uniqid = h3.uniqid 上加入历史 h3 在 h3.uniqid = h4.uniqid 和 h3.whenseenlast > h4.whenseenlast 上留下加入历史 h4

其中 h2.uniqid 为空,h4.uniqid 为空

于 2012-12-12T17:11:31.807 回答