3

私のタイトルが私が実行しようとしているタスクを適切に説明していない場合は申し訳ありません.

大学のプロジェクトで、Web サイトのアクセス ログを受け取りました。不要な列を破棄して、次のように要約しました。

╔══════════╦══════════════════════╦═════════════════╦═════════════╦════════════════╗
║ accessid ║ date_time_in_seconds ║ yg_requester_id ║ referent_id ║ referent_docid ║
╠══════════╬══════════════════════╬═════════════════╬═════════════╬════════════════╣
║     2449 ║        2009011621830 ║           32276 ║       12648 ║              1 ║
║     2776 ║        2009011622726 ║           76360 ║       11070 ║              1 ║
║     2804 ║        2009011622783 ║           32276 ║       13845 ║              1 ║
║     2894 ║        2009011623025 ║           32276 ║        7222 ║              1 ║
║     2895 ║        2009011623037 ║           32276 ║        1530 ║              1 ║
║     3000 ║        2009011623406 ║           32276 ║        3728 ║              1 ║
║     3019 ║        2009011623497 ║          520060 ║       10356 ║              1 ║
║     3245 ║        2009011625780 ║          300841 ║        4607 ║              1 ║
║     3274 ║        2009011628309 ║          532664 ║       14377 ║              1 ║
║     3275 ║        2009011628420 ║          532664 ║        9097 ║              1 ║
╚══════════╩══════════════════════╩═════════════════╩═════════════╩════════════════╝

当初、時刻と日付スタンプは測定単位 (年、月、日、時、分、秒) ごとに別々の列にありましたが、計算を簡単にするために、次の形式の date_time_in_seconds にそれらを統合しました。

[0000][00][00][00000]
[YEAR][MONTH][DAY][Number of Seconds since 00:00]

accessid はテーブル エントリ ID、yg_requester_id は Web サイト訪問者の一意の ID、referent_id は閲覧した Web サイト記事の ID、referent_docid は記事のタイプを示しますが、このタスクでは必要ありません。

基本的には、同じ yg_requester_id が最後に異なる referent_id にアクセスしてからの時間差を見つけられるようにしたいと考えています。たとえば、上の表の行のこのセクションを見ると、次のようになります。

╔══════════╦══════════════════════╦═════════════════╦═════════════╦════════════════╗
║ accessid ║ date_time_in_seconds ║ yg_requester_id ║ referent_id ║ referent_docid ║
╠══════════╬══════════════════════╬═════════════════╬═════════════╬════════════════╣
║     2449 ║        2009011621830 ║           32276 ║       12648 ║              1 ║
║     2776 ║        2009011622726 ║           76360 ║       11070 ║              1 ║
║     2804 ║        2009011622783 ║           32276 ║       13845 ║              1 ║
╚══════════╩══════════════════════╩═════════════════╩═════════════╩════════════════╝

yg_requester_id 32276 は、2009 年 1 月 16 日の 06:03:50 (午前 0 時から 21830 秒) に ID 12648 の記事にアクセスしました。その後、16 日の06:19:43 (午前0時から22783)にID 13845の記事にアクセスしました。 2009 年 1 月。したがって、ユーザーが最初の記事 (id 12648 ) を約 15 分 50 秒間読んだと想定しても安全です。

私が見つけたいのは、同じユーザーがアクセスした記事間の時間差です。ユーザーが読んだ連続した記事には、連続した accessid がない場合があります (ただし、常に増加します)。また、タスクは読み取り時間が変数の分数 (たとえば 15 分)未満のレコードを除外することであるため、読み取り時間を約 1 時間に制限したいと思います。

事前に感謝します。さらに情報が必要な場合はお知らせください

4

2 に答える 2

2

ROW_NUMBER を使用して結果セットを yg_requester_id で分割し、accessid または datetime のいずれかで並べ替えます (コメントで提案されているように、date_time_in_seconds 列を通常の datetime 列に変更すると仮定します。次に、リクエスターによって結果セットを結合し、前のレコードに移動し、差を取得します。

適切なデータを持たないクエリを作成してみましょう。

SELECT X1.yg_requester_id, DATEDIFF(SECOND, X1.NewDateTimeField, X2.NewDateTimeField) AS TimeDifferenceInSeconds, X1.referent_id AS NewArticle, X2.referent_id AS FormerArticle
FROM
(
SELECT ROW_NUMBER() OVER(PARTITION BY yg_requester_id ORDER BY NewDateTimeField DESC) AS Position, NewDateTimeField, yg_requester_id, referent_id
FROM YourTable

) X1
INNER JOIN 
(
SELECT ROW_NUMBER() OVER(PARTITION BY yg_requester_id ORDER BY NewDateTimeField DESC) AS Position, NewDateTimeField, yg_requester_id, referent_id
FROM YourTable  
) X2 ON X2.yg_requester_id = X1.yg_requester_id AND X2.Position = X1.Position - 1
于 2012-10-02T10:40:01.040 に答える
0

このクエリは、リクエスタ、リファレント、およびリクエスタがリファレントで取得した秒単位の時間差を取得する必要があります。

select abc.A_requestor as requestor_id,abc.B_refer as referent_id,abc.A_datetime-abc.B_datetime as time_difference   from 
(select a.accessid as A_accessid ,b.accessid as B_accessid,
a.yg_requestor_id as A_requestor,a.date_time_in_seconds as A_datetime,a.referent_id as A_refer,
b.yg_requestor_id as B_requestor,b.date_time_in_seconds as B_datetime,b.referent_id as B_refer
from weblog a
inner join weblog b
on a.yg_requestor_id = b.yg_requestor_id
and a.date_time_in_seconds > b.date_time_in_seconds
and a.referent_id != b.referent_id) abc

inner join 

(select cte.B_accessid,min(cte.A_accessid) as C_accessid from
(select a.accessid as A_accessid ,b.accessid as B_accessid,
a.yg_requestor_id as A_requestor,a.date_time_in_seconds as A_datetime,a.referent_id as A_refer,
b.yg_requestor_id as B_requestor,b.date_time_in_seconds as B_datetime,b.referent_id as B_refer
from weblog a
inner join weblog b
on a.yg_requestor_id = b.yg_requestor_id
and a.date_time_in_seconds > b.date_time_in_seconds
and a.referent_id != b.referent_id) cte 
group by cte.B_accessid ) xyz

on xyz.B_accessid = abc.B_accessid and xyz.C_accessid = abc.A_accessid
于 2012-10-02T11:03:18.593 に答える