0

私はかなり SQL の初心者であり、これを理解できないようですので、助けを期待しています (非常に簡単です!)。

Web サイトからスクレイピングされたデータから生成されたデータのテーブルがあります。データは頻繁に変更され、新しい情報が到着し、古い情報が消え、データスクレイプが毎分実行されます。

列:TimeStamp, User, RowA, RowB, RowC

最初の列はtimestamp値であり、その 1 分間に Web ページで生成された新しいコンテンツがない場合、残りの行は多くの場合同じです。

私がやりたいことは、新しいデータがページに到着してから消えるまでの時間を把握することです。

これを行うには、タイムスタンプ値を除いて ABC がすべて同じである行をチェックし、最初の結果と最後の結果の時間差を比較する select ステートメントを実行できると考えています。

例:

10:00AM, James, Apples, Oranges, Pears
10:01AM, James, Apples, Oranges, Pears
10:02AM, James, Apples, Oranges, Pears 
10:03AM, James, Apples, Watermelon

私が知りたいのは、列James, Apples, Oranges, Pearsが午前 10 時から午前 10 時 3 分まで存在し、そこに 3 分間存在していたと計算できることです。

いつものようにどんな助けでも大歓迎です。

UPDATE
これをさらに明確にするために、これは値が既知のクエリではありません-クエリから受け取った値を見て、それらが同じかどうかを比較する必要があります(タイムスタンプを除く)-ありがとう回答の量、本当に感謝しています

4

3 に答える 3

0

最大時間と最小時間の差を計算できます。

select `user`, rowa, rowb, rowc,
       min(`timestamp`), max(`timestamp`),
       timediff(min(`timestamp`), max(`timestamp`))
from mytable
group by `user`, rowa, rowb, rowc;
于 2012-11-13T23:20:32.163 に答える
0

おそらく、データ値を繰り返すことができます。あなたの例では、James、Apples、Oranges、Pears が午前 11:00 に再び現れる可能性があり、それが新しいシーケンスになります。

クエリの背後にある考え方は、各グループがいつ終了するかを見つけることです。これは、データ値が異なり、タイム スタンプが大きい次のレコードを待ちます。実際、そのようなタイムスタンプの最小値がグループを識別します。過去を振り返って同じようなことを実際に行うこともできますが、私は前向きに考えるほうが好きです。

標準 SQL でこれを行う方法は、次のように相関サブクエリ (または非等結合) を使用することです。

select user, RowA, RowB, RowC, min(TimeStamp) as StartTimeStamp,
       EndTimeStamp
from (select User, RowA, RowB, RowC, TimeStamp,
             (select Min(timeStamp)
              from t t2
              where t2.TimeStamp > t1.TimeStamp and
                    (t2.user <> t.user or
                     t2.RowA <> t.rowA or
                     t2.RowB <> t.RowB or
                     t2.RowC <> t.RowC
                    )
             ) as EndTimeStampe
      from t
     ) t
group by user, RowA, RowB, RowC, EndTimeStamp

NULL は「等しい」場合でも自動的に比較に失敗するため、これは値が NULL ではないことを前提としていることに注意してください。これは、次の 2 つの方法で修正できます。

(coalesce(t2.user, '<null>') <> coalesce(t.user, '<null'>) or . . .

また

(t2.user <> t.user and ((t2.user is not null and t.user is null) or (t2.user is null and t.user is not null))

SQL の一部のダイアレクト (SQL Server 2012 や Oracle など) は、この問題の解決にも役立つ、より広範なウィンドウ関数を提供します。

また、非常に大きなテーブルがある場合、これはかなり非効率的です。(TimeStamp、user、RowA、RowB、RowC) にインデックスがある場合に役立ちます。

于 2012-11-13T23:21:16.670 に答える
0

SQL の種類によっては、おそらく日付関数を使用してタイムスタンプを減算することをお勧めします。where クラスを取り除くと、グループ化が表示されます。

Select
  RowA, -- Calling columns "Row" isn't confusing at all
  RowB,
  RowC,
  Min(timestamp),
  Max(timestamp),
  Max(timestamp) - Min(timestamp)
From
  Scrape
Where
  RowA = 'James' And
  RowB = 'Apples' And 
  RowC = 'Oranges'
Group By
  RowA,
  RowB,
  RowC
于 2012-11-13T23:17:48.770 に答える