0

データベースのpostgresql ver.で小さな災害が発生しました。8.4. お願い助けて!

次のような 2 つのテーブルで、Web ページの訪問者をフォローする必要があります。

テーブルの歴史

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 は主キーで、各訪問者はこのテーブルで 1 回だけ見つかります)

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 COLUMNSを復元できないことはわかっていますが、それは大したことではありません)

解決策を提案していただけますか?

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 left 履歴 h2 on h1.uniqid = h2.uniqid および h1.whenseenlast < h2.whenseenlast を選択

h1.uniqid = h3.uniqid の履歴 h3 に参加 h3.uniqid = h4.uniqid および h3.whenseenlast > h4.whenseenlast の履歴 h4 に参加

h2.uniqid が null で、h4.uniqid が null の場合

于 2012-12-12T17:11:31.807 に答える