0

我是 SQL n00b,我似乎无法弄清楚这一点,所以希望得到一些帮助(它非常简单!)。

我有一张从网站上抓取的数据生成的数据表。数据只是随着新信息的到达和旧信息的消失而经常变化,数据抓取每分钟都会运行一次。

列:TimeStamp, User, RowA, RowB, RowC

第一列是一个timestamp值,如果在那一分钟内网页上没有生成新内容,则其余行通常相同。

我想要做的是弄清楚新数据到达页面和消失之间的时间。

为此,我认为我可以执行一个 select 语句来检查除时间戳值外 ABC 都相同的行,然后比较第一个结果和最后一个结果之间的时间差。

例子:

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:00 到上午 10:03 之间存在,并且能够计算出它存在 3 分钟。

非常感谢任何帮助。

更新
为了进一步澄清这一点,这不是一个已知值的查询——它需要查看从查询中收到的值并比较它们是否相同(时间戳除外)——感谢回复的数量,我真的很感激

4

3 回答 3

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 回答
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 也会自动使比较失败。您可以通过以下两种方式解决此问题:

(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 回答